Database 拉威尔5.3如何从where子句中的关系和orderBy子句中使用sum(';列';)

Database 拉威尔5.3如何从where子句中的关系和orderBy子句中使用sum(';列';),database,laravel,eloquent,sum,relation,Database,Laravel,Eloquent,Sum,Relation,我有两个表:用户和用户操作。我需要获取所有用户的位置('available',true)(…和一些其他逻辑),并按用户的操作总数排序。单击列 public function actions() { return $this->hasMany(UserActions::class); } 我需要这样的东西: User::where('available', true)->where("something else....")->orderBy('sum(user

我有两个表:用户和用户操作。我需要获取所有用户的位置('available',true)(…和一些其他逻辑),并按用户的操作总数排序。单击列

public function actions()
{
        return $this->hasMany(UserActions::class);
}
我需要这样的东西:

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

结果必须是用户类的集合。

您可以执行以下操作

->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();
或者,您可以使用
排序方法,如下所示:

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

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

无需按用户分组。id您将只获得一行,所有单击的总和为
。谢谢,这也是我的第一个解决方案,但如果使用join,我会遇到以下错误:“语法错误或访问冲突:1055'compari_ci.users.created_at'不在GROUP BY…”created_at只是users表中的另一个字段。我使用的是Laravel 5.3 btw。这与MySQL有关。如果我这样做,请检查此答案,我只获取总和,没有用户属性:
$query->join('user_actions'、'user_actions.user_id'、'='、'users.id');$query->selectRaw('sum(user_actions.clicks)as clicks');$query->groupBy('user_id');$query->orderBy('clicks'、'desc'))
所以你建议按所有用户字段分组?我觉得这不对。或者你可以试试这个解决方案