Как удалить несколько файлов при одновременном удалении поста и информации в базе данных?

Работаю над админкой – CRUD для сайта. Каждый пост имеет галерею изображений, информация о которых хранится в отдельной таблице базы данных. Файлы изображений загружаются и хранятся в /storage/app/public.

Возникла некоторая проблема при удалении файлов изображений из папки storage при удалении поста. С удалением информации о данных файлах в базе данных проблем нет, но имею некоторое непонимание как при удалении поста удалить группу файлов, привязанных к посту.

Прошу помощи. Подскажите наиболее рациональный способ?

//Pechnik -  модель/таблица содержит данные поста
//Images - модель/таблица содержит информацию о  изображениях галереи 

// - метод ресурсного контролера для удаления поста
 public function destroy($id)
    {
        Images::where('pechnik_id', $id)->delete();
        Pechnik::find($id)->delete();
        return redirect()->route('admin.index')->with('success', 'Информаця успешно удалена');
    }
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
@voland700 Автор вопроса
Опишу решение данной задачи. Мною задача по одновременному удалению файлов галерей при удалении поста, решена так:
//Pechnik -  модель/таблица содержит данные поста
//Images - модель/таблица содержит информацию о  изображениях галереи 
 
// - метод ресурсного контролера для удаления поста
    public function destroy($id)
    {
        $images = Images::where('pechnik_id', $id); //получаю колекцию файлов галереи превязанных к ID поста p из таблицы Images
        $pathImages = $images->get('img'); //получаю данные наименование и путь файлов галереи превязанных к ID поста
        if (!$pathImages->isEmpty()){ 
            foreach ($pathImages as $img){ 
                $path = $img->img; 
                Storage::disk('public')->delete(str_replace('storage', '', $path)); //в цикле удаляю фалы галереи превязанных к ID поста
            }
        }
        $images->delete(); // удаляю записи в таблице Images:: о файлах галереи
        $pechnik= Pechnik::find($id);   // получаю данные поста по ID из таблицы Pechnik::
        Pechnik::find($id)->delete();  // удаляю запись в таблице Pechnik:: - данные поста
        return redirect()->route('admin.index')->with('success', 'Информаця успешно удалена');
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kandrash
Кратко о себе
Посмотрите в сторону событий https://laravel.com/docs/8.x/eloquent#events

// В контроллере картинки не трогаем
public function destroy($id)
{
    Pechnik::destroy($id);
    // return ..
}

// Pechnik.php
protected static function booted()
{
    // При удалении удаляем связаные картинки
    static::deleted(function (Pechnik $pechnik) {
        // Обновлено, т.к. mass delete не вызывает событие для модели Image
        // $pechnik->images()->delete();
        // Подход тоже не оптимальный, лишние запросы к БД. Есть что улучшать.
        foreach ($pechnik->images as $image) {
            $image->delete();
        }
    });
}

// Image.php
protected static function booted()
{
    // Удаление картинки из БД - удаляем файл
    static::deleted(function (Image $image) {
        // Удаляем файл
    });
}
Ответ написан
@lavren
На событие удаления Images нужно реализовать удаление изображения с диска. при таком подходе не важно удаляем мы картинки определенной модели или рандомные.

https://laravel.com/docs/8.x/eloquent#observers
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы