Laravel: Сортировка по количеству комментариев

В этой короткой заметке я покажу как можно сделать сортировку eloquent по колличеству связанных моделей.

Предположим вы решили сделать соритровку статей на сайте по популярности, где коофициентом популярности будет колличество комментариев к статье. Как же добиться подобного результата? 

Решение как всегда в духе Laravel минималистичное и элегантное, нам всего лишь необходим метод withCount();

Итак предположим что у нас есть модель Node отвечающая за статьи и модель Comment отвечающая за комментарии, обе модели уже связанны методом many-tomany, по типу:

class Node extends Model
{
//....
    public function comments()
    {
        return $this->hasMany('App\Comment', 'comment_post_ID', 'id');
    }
//....
}

Теперь в контроллере где вы выводите ваши статьи нужно к модели Node прицепить метод withCount() вот таким образом:

Node::withCount('comments')->orderBy('comments_count', 'desc');

Далее вы можете добавлять свои прочие методы сортировки и фильтрации. Вот так это может выглядеть с другими параметрами:

Node::withCount('comments')
  ->orderBy('comments_count', 'desc')
  ->where('status', 'publish')
  ->paginate(12);

return view('articles')->with('nodes', $nodes);

Вот так просто можно делать сортировки по связанной модели в Laravel!