#laravel #eloquent
#laravel #красноречивый
Вопрос:
У меня есть следующие таблицы:
competitions (id, ...)
questions (id, ...)
teams (id, ...)
team_user (id, user_id, team_id, ...)
answer_user (user_id, competition_id, question_id, points, ...)
Я пытаюсь создать запрос для перечисления всех команд, участвовавших в соревновании id = 20, учитывая, что мы сортируем список на основе накопления очков пользователей команд. Однако иногда две команды получают одинаковое общее количество очков, поэтому нам нужно показать команду, которая смогла набрать это общее количество очков первой в списке перед другими (на основе столбца answers created_at)
Я могу получить этот список, используя следующий запрос, но не могу выполнить сортировку на основе столбца answer_user created_at:
$ranks = Team::withCount(['answers' => function ($q) use ($competition_id) {
$q->where('competition_id', $competition_id)
->select(DB::raw('sum(points)'));
}])
->where('competition_id', $competition_id)
->orderBy('answers_count', 'desc')
->get();
Правка 1
Я могу добиться требуемой сортировки, когда заменяю
->select(DB::raw('sum(points)')
с
->select(DB::raw('max(answer_user.created_at)')
Тем не менее, я хочу, чтобы на самом деле работали обе агрегации. В принципе, нужно найти общее количество очков, набранных каждой командой, затем отсортировать их по времени, первым наберет тот, кто покажет первым.
Комментарии:
1. Содержит ли ваша таблица teams
competition_id
столбцы?2. Для достижения этого эффекта можно использовать несколько сортировок github.com/laravel/ideas/issues/11
3. @greed chikara, да, это так
Ответ №1:
Пожалуйста, попробуйте использовать функцию sortBy()
or sortByDesc()
после get()
https://laravel.com/docs/5.8/collections#method-sortbydesc
$ranks = Team::withCount(['answers'=>function($q) use($competition_id){
$q->where('competition_id',$competition_id)->select(DB::raw('sum(points)'));
}])->where('competition_id',$competition_id)->get()->sortByDesc('answer_user');
Комментарии:
1. У текущего запроса нет доступа к
answer_user
, поэтому он не сможет отсортировать его по нему.2. Попробуйте это
->sortByDesc('answers.answer_user ');
3.
withCount
не загружает взаимосвязь, оно только выдает количество.4. Я попробовал оба sortBy amp; sortByDesc, и оба возвращают один и тот же список, хотя каждый из них фактически должен возвращать список в разном порядке
5. Я согласен @greedchikara, но должен быть способ получить доступ к взаимосвязи для сортировки, точно так же, как мы сделали для SUM с помощью withCount