Как правильно при удалении поста удалять все зависимые от поста модели?

Есть такая иерархия:
Пост
--Отзыв
----Комментарии к отзыву
------Комментарии к комментарию


При удалении поста, мне необходимо удалить сам отзыв, комменты к этому отзыву и комментарии к комментариям (ответы на комментарии).

Для каждой из модели использую соответствующий класс Observer, в котором реализую метод deleting(). Получается что-то вроде этого:

PostObserver.php

public function deleting(Post $post)
    {
        $post->loadMissing('reviews');

        foreach ($post->reviews as $review) {
            $review->delete();
        }
    }


ReviewObserver.php

public function deleting(Review $review)
    {
        $review->loadMissing('replies');

        foreach ($review->replies as $reply) {
            $reply->delete();
        }
    }


CommentObserver.php

public function deleting(Comment $comment)
    {
        $comment->loadMissing('replies');

        foreach ($comment->replies as $reply) {
            $reply->delete();
        }   
    }



Cпервая я в каждом методе хотел просто вызывать такую цепочку: $model->relationship()->delete();, но при таком использовании события удаления не будут срабатывать на других моделях.

Код выше работает, но меня совсем не радует, что при большом объеме отзывов и ответов к ним, будет производиться довольно большое количество запросов (на удаление каждого комментария, отзыва).

Есть ли способы оптимизировать данный код?
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 3
New_Horizons
@New_Horizons
Бред:
возможно подойдёт on delete cascade, но в таком случае не будут выполняться евенты моделей, если они как-то задействованы
Ответ написан
@Kostik_1993
Web Developer
Удалять средствами базы данных если нет другой бизнес логики в коде через delete cascade
Ответ написан
Комментировать
@James026
Можно еще вариантик, как пишут выше - использовать средства db, но зайюзать ON DELETE SET NULL
И сделать команду, которая по крону будет удалять записи у которых ключи null
Таким образом не будет подлагивания интерфейса при удалении модели с большим количеством связей + сохранятся эвенты у удаляемых моделей
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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