2016-12-09 5 views
2

У меня есть две таблицы: пользователи и user_actions. Мне нужно получить всех пользователей, где («доступно», «истина») (... и другая логика) и упорядочить их по сумме столбца user_actions.clicks.Laravel 5.3. - как использовать sum ('column') из отношения в where where и orderBy it

public function actions() 
{ 
     return $this->hasMany(UserActions::class); 
} 

мне нужно что-то вроде этого:

User::where('available', true)->where("something else....")->orderBy('sum(user_actions.clicks)', 'desc')->get(); 

Результат должен быть коллекция класса пользователя.

ответ

1

Вы можете попробовать DB::raw в orderBy как:

User::where('available', true) 
    ->where("something else....") 
    ->join('user_actions', 'users.id', '=', 'user_actions.user_id') 
    ->orderBy(DB::raw("sum('user_actions.clicks')")) 
    ->groupBy('users.id') 
    ->select('users.*') 
    ->get(); 

Или вы могли бы использовать sortBy методы сбора, как:

User::where('available', true)->with('user_actions')->get() 
    ->sortBy(function ($user) { 
     return $user->user_actions->sum('clicks'); 
    }); 

Как правило, вы можете обрабатывать все это на конец базы данных, но этот способ стоит того, потому что он значительно упрощает процесс.

+0

спасибо, это было мое первое решение, но если я использую join, я получаю эту ошибку: «Ошибка синтаксиса или нарушение доступа: 1055« compari_ci.users.created_at »не находится в GROUP BY ...» created_at - это еще один поле в таблице пользователей. Я использую Laravel 5.3 btw. –

+0

Это связано с MySQL. Пожалуйста, проверьте этот ответ http://stackoverflow.com/questions/34115174/error-related-to-only-full-group-by-when-executing-a-query-in-mysql –

+0

Если я это сделаю, я получаю только значение суммы и атрибуты пользователя: '$ query-> join ('user_actions', 'user_actions.user_id', '=', 'users.id'); $ query-> selectRaw ('sum (user_actions.clicks) как клики'); $ query-> groupBy ('user_id'); $ query-> orderBy ('clicks', 'desc'); ' –

0

Вы могли бы сделать что-то вроде

->selectRaw('user_actions.clicks, sum(user_actions.clicks) as clicks') 
->where('available', true)->where("something else....") 
->orderBy('clicks', 'desc'); 
+0

Без группировки users.id вы получите только одну строку с 'SUM' всех кликов. –

 Смежные вопросы

  • Нет связанных вопросов^_^