Как вывести список постов с количеством комментов под ними через 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?


Ответы (0 шт):