如何用Laravel Eloquent实现用户关联数据的分组统计查询
使用Laravel Eloquent实现指定关联统计查询
已知User模型对应users表,UserData模型对应user_datas表,二者为hasMany关联关系,以下两种方式可以实现你给出的SQL查询:
方式一:贴近原生SQL的查询构建
直接通过Eloquent查询构造器复现原生SQL逻辑:
$results = User::select([ 'users.user_id', \DB::raw("SUM(CASE WHEN user_datas.code_type = 'P' THEN 1 ELSE 0 END) AS Paused"), \DB::raw("SUM(CASE WHEN user_datas.code_type = 'A' THEN 1 ELSE 0 END) AS Active") ]) ->join('user_datas', 'users.user_id', '=', 'user_datas.user_id') ->groupBy('users.user_id') ->orderBy('users.user_id', 'asc') ->get();
这里用DB::raw()保留原生的CASE统计逻辑,通过join关联两张表,最后按user_id分组排序并获取结果。
方式二:利用Eloquent关联特性实现
借助withCount方法结合关联统计,代码更贴合Eloquent风格:
// 需确保User模型中已定义关联: // public function userDatas() // { // return $this->hasMany(UserData::class, 'user_id', 'user_id'); // } $results = User::withCount([ 'userDatas as Paused' => function ($query) { $query->where('code_type', 'P'); }, 'userDatas as Active' => function ($query) { $query->where('code_type', 'A'); } ]) ->has('userDatas') // 仅保留有user_datas记录的用户,对应原生SQL的INNER JOIN ->orderBy('user_id', 'asc') ->get(['user_id', 'Paused', 'Active']);
这种方式通过withCount分别统计不同code_type的记录数,has('userDatas')过滤掉无关联数据的用户,最终返回指定字段的统计结果。
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

