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');
    });

通常,您可以在数据库端处理这一切,但这种方式是值得的,因为它大大简化了过程。