Laravel 5.3。 - 如何在 where 子句和 orderBy 中使用关系中的 sum('column')
Laravel 5.3. - how to use sum('column') from relation in where clause and orderBy it
我有两个表:users 和 user_actions。我需要让所有用户 where('available', true) (...和其他一些逻辑)并按 user_actions.clicks 列的总和排序。
public function actions()
{
return $this->hasMany(UserActions::class);
}
我需要这样的东西:
User::where('available', true)->where("something else....")->orderBy('sum(user_actions.clicks)', 'desc')->get();
结果必须是用户 class 的集合。
你可以做类似
->selectRaw('user_actions.clicks, sum(user_actions.clicks) as clicks')
->where('available', true)->where("something else....")
->orderBy('clicks', 'desc');
您可以在 orderBy
中尝试 DB::raw
作为:
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');
});
通常,您可以在数据库端处理这一切,但这种方式是值得的,因为它大大简化了过程。
我有两个表:users 和 user_actions。我需要让所有用户 where('available', true) (...和其他一些逻辑)并按 user_actions.clicks 列的总和排序。
public function actions()
{
return $this->hasMany(UserActions::class);
}
我需要这样的东西:
User::where('available', true)->where("something else....")->orderBy('sum(user_actions.clicks)', 'desc')->get();
结果必须是用户 class 的集合。
你可以做类似
->selectRaw('user_actions.clicks, sum(user_actions.clicks) as clicks')
->where('available', true)->where("something else....")
->orderBy('clicks', 'desc');
您可以在 orderBy
中尝试 DB::raw
作为:
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');
});
通常,您可以在数据库端处理这一切,但这种方式是值得的,因为它大大简化了过程。