Задать вопрос
MegaMufa
@MegaMufa

Как в Yii реализовать удаление файлов при удалении связанных записей из БД?

Добрый день.

При удалении записи из БД необходимо удалять соответствующие ей файлы с диска.
Для этого в afterDelete() делается запись в специальную таблицу со списком файлов для удаления. А потом по крону файлы из этой таблицы удаляются.

При этом автоматом на уровне базы удаляются все связанные записи. Для них так же нужно удалять файлы. Ну и понятно, что при удалении их через внешние ключи, файлы остаются.

Я вижу два пути решения проблемы:
1. В beforeDelete() родительской модели удалять все связанные. Т.е. делать это на уровне приложения. Но связанных записей много и это будет создавать неслабую излишнюю нагрузку.

2. Повесить на таблицу тригер и делать пометку об удалении файла через него. Но в таком случае возникает проблема: путь к файлу вычисляется на основании нескольких полей. И делается это динамически. И в таком случае эта логика будет дублироваться в базе и в приложении. Потом можно будет запутаться.

Подскажите, как выйти из этой ситуации?
  • Вопрос задан
  • 3740 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1. замените крон на очередь задачь (rabbitmq/zeromq)
2. Логику удаления лучше все же хранить в модели а еще лучше сделать сервис который будет все это разруливать (для того что бы не появился лишний геморой при деплое). Можно также реализовать отложенное удаление (опять же через менеджер очереди) где будет происходить все тяжелое. В любом случае это лучше выносить в отедльный сервис.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
metamorph
@metamorph
В триггере сохранять набор полей, на основании которых вычисляется путь, а потом по крону запускать консольное yii-приложение, где функция вычисления пути уже известна.

В порядке общего бреда:
3. Хранить файлы в БД (плохой вариант, зато беспроблемный)
4. Удалять файлы прямо из БД (эй, у Вас же постгрес! к нему можно хранимую логику писать на питоне и перле)
5. Упростить вычисление пути файла до встроенной функции (грубо говоря, md5(filename)),
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы