Есть система отзывов для постов, которая работает так: К посту можно оставить отзыв, а к отзыву - комментарий. Получается 3 модели Post, Review, Comment. В модели Post я создаю новый аттрибут, который возвращает количество комментариев в посте через отзывы этого поста.
public function getCommentsCountAttribute() : int
{
return $this->hasManyThrough(
Review::class,
Comment::class,
'commentable_id',
'reviewable_id'
)
->where('commentable_type', Review::class)
->count();
}
Но так как это атрибут поста (comments_count), то он высчитывается для каждого поста, получается что помимо выборки 30 постов, я делаю по одному запросу на каждый пост для подсчета количества комментариев, получается что я дополнительно делаю 30 запросов.
Есть ли вариант добавлять выборку атрибута как и отношение через
Post::with()
или необходимо подгружать заранее все отзывы в посты, с заранее подгруженными комментариям, а затем в методе работать с уже загруженными данными? Или есть способ лучше?