You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:45:39