Есть такая иерархия:
Пост
--Отзыв
----Комментарии к отзыву
------Комментарии к комментарию
При удалении поста, мне необходимо удалить сам отзыв, комменты к этому отзыву и комментарии к комментариям (ответы на комментарии).
Для каждой из модели использую соответствующий класс 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();
, но при таком использовании события удаления не будут срабатывать на других моделях.
Код выше работает, но меня совсем не радует, что при большом объеме отзывов и ответов к ним, будет производиться довольно большое количество запросов (на удаление каждого комментария, отзыва).
Есть ли способы оптимизировать данный код?