Как вывести список постов с количеством комментов под ними через Eloquent?
На самописном движке я делаю 2 запроса: один в таблицу с постами доставая 10 последних штук, второй в комменты добавляя к нему WHERE IN с десятком id вытащенных первым запросом постов. Страница генерируется за 0.06 секунды.
Теперь пробую то же самое провернуть через Eloquent в Laravel.
Сначала попробовал сделать это через акцессор в модели Post
public function getCountCommAttribute()
{
return $this->hasMany('\App\Models\Comment', 'id_post')->count();
}
и выводить их во вьюшке через count_comm, но оказалось, что при таком подходе Laravel делает 10 дополнительных запросов в базу, каждый по 25 миллисекунд!
Потом решил переделать все доставая кол-во комментов сразу же в первом запросе прицепив их с помощью withCount.
В модели Post создаем отношение hasMany:
public function comments()
{
return $this->hasMany('\App\Models\Comment', 'id_post');
}
Добавляем withCount к запросу:
$posts = \App\Models\Post::orderBy('id', 'DESC')
->where('moderate', 1)
->withCount('comments')
->paginate(10);
Все работает. Во вьюшке кол-во комментов доступно по {{post.comments_count}}. Но, движок генерирует для всего этого и делает глупейший запрос в базу, который обрабатывается 1.1 секунды!
select
`post`.*,
(select count(*) from `comments` where `post`.`id` = `comments`.`id_post`) as `comments_count`
from `post`
where `moderate` = 1
order by `id` desc
limit 10
offset 0
Я что-то не понял в Eloquent и можно как-то сделать все красиво или для этого придется городить запросы вручную через DB::table?