@EvgeniiR
https://github.com/EvgeniiR

Как реализовать удаление изображений, при удалении продукта из магазина?

Есть интернет магазин. В БД содержатся таблицы:
Categories; Subcategories; Products; Product_images;

Product_images хранит пути к изображениям.

Как правильнее реализовать удаление собственно изображений при удалении продукта.

Сейчас настроил через Foreign keys, что при удалении категории автоматически удалятся её подкатегории.
За подкатегорией удаляться её продукты, а за продуктами удаляться и информация об их изображениях из БД.
Пример:
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');


Стоит ли вообще использовать тут foreign keys и cascade в sql для автоматического удаления? Или может реализовать это всё уже в коде, т.е. При удалении категории сначала выбрать и получить все подкатегории, потом каждую в цикле удалять, для того, чтобы срабатывали события deleting и deleted, которые соответственно проделают тоже самое со своими продуктами, которые соответственно с изображениями.
(https://github.com/laravel/framework/issues/2536 - о вызове событий delete*)
Таким образом по порядку будут вызываться события deleted, и можно будет без проблем добавлять при этом любые свои действия, такие как физическое удаление изображений.

Мне кажется что имея настроенные foreign keys проходиться по всему этому в коде дополнительно - глупо. Так как можно перенести тогда удаление полностью в код и обойтись только им.

Не будет ли костылём тот вариант удаления что я предлагал выше?
Меня по началу смущало, что это добавит по циклу в методе destroy каждой модели в этой структуре. Однако, как я понимаю решение через foreign keys так просто не расширить до нужного функционала.
Проект полностью учебный. с целью саморазвития и освоения новых технологий.
  • Вопрос задан
  • 243 просмотра
Решения вопроса 2
@entermix
Ну, связи в БД не позволят Вам удалить изображение, поэтому нужно продумать логику в самом приложении.

P.S. Если используете MySQL - обратите внимание:
Почему не срабатывает триггер MYSQL?
Ответ написан
Комментировать
xpert13
@xpert13
Full Stack Developer
При удалении категории сначала выбрать и получить все подкатегории, потом каждую в цикле удалять, для того, чтобы срабатывали события deleting и deleted, которые соответственно проделают тоже самое со своими продуктами, которые соответственно с изображениями.

Если нужно вешать какую-то логику на события удаления - то только так. Как альтернатива - делать soft delete при удалении категории, это будет быстрее. А если вам в БД эти записи не нужны - можно по крону уже физически удалять все soft deleted категории/подкатегории/товары.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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