Database 拉威尔5.3如何从where子句中的关系和orderBy子句中使用sum(';列';)
我有两个表:用户和用户操作。我需要获取所有用户的位置('available',true)(…和一些其他逻辑),并按用户的操作总数排序。单击列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
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'))
所以你建议按所有用户字段分组?我觉得这不对。或者你可以试试这个解决方案