Задать вопрос
@semen07

Как сортировать по полю?

Добрый вечер!
Есть две таблицы: posts (id, name, text) и comments (id, text, post_id)
Как отсортировать посты по количеству комментариев?
Нашел и пробовал через join:

$posts = Post::with('comments')
            ->join('comments', 'comments.post_id', '=', 'posts.id')
            ->select('posts.*', 'comments.*')
            ->groupBy('posts.id')
            ->orderBy(DB::raw('COUNT(`posts`.`id`)'), 'asc')
            ->get();


Но пишет что запрос не правильный Syntax error or access violation
  • Вопрос задан
  • 330 просмотров
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
ajaxtelamonid
@ajaxtelamonid
Laravel
Подразумеваем, что есть модель Post с реляцией comments() которая hasMany
$postsWithCountOfComments = Post::withCount("comments")->get();
$sortedPosts = $postsWithCountOfComments->sortByDesc('comments_count');

В laravel не просто так коллекции вместо массивов возвращаются во всех бд-функциях. Пользуйтесь ими, они супер.
https://laravel.com/docs/5.4/eloquent-relationship...
https://laravel.com/docs/5.4/collections
Ответ написан
@BorisKorobkov
Web developer
1. Если groupBy('posts.id'), то нельзя select('comments.*'). Ибо неоднозначно
Вообще говоря, при groupBy('posts.id') можно только select('posts.id') + групповые функции. Хотя MySQL и пропустит некоторый говнокод, но это не повод так писать.

2. Количество комментариев - это COUNT(comments.post_id) или проще COUNT(*). А COUNT(posts.id) при GROUP BY posts.id - очевидно, всегда будет 1

3. Если все равно ошибка, то укажите полученный SQL

4. Ну а вообще правильный способ - создать новое поле posts.count_comments с индексом и пересчитывать его при изменении комментария.
Ответ написан
Комментировать
hahenty
@hahenty
('•')
SELECT COUNT ( id ) AS cntd 
FROM comments 
GROUP BY post_id 
ORDER BY cntd

Так-то стандартный запрос на подсчет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы