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

如何通过PHP ActiveRecord ORM实现GROUP BY统计行数?

用PHP ActiveRecord实现GROUP BY的COUNT统计(不用custom_sql)

嘿,我之前刚好折腾过类似的需求,其实不用非得靠custom_sql,PHP ActiveRecord的查询构建器本身就支持这种统计操作,完全能对应你给出的SQL语句。下面给你两种常用的实现方式:

方式一:返回模型对象集合(适合需要同时访问其他字段的场景)

假设你的模型类是School(对应数据库里的SCHOOL表),可以用all()方法配合select和group参数来实现:

// 执行统计查询
$gradeStats = School::all([
    'select' => 'grade_level, COUNT(*) AS count_total',
    'group'  => 'grade_level',
    // 可选:按年级排序,按需添加
    'order'  => 'grade_level ASC'
]);

// 遍历结果
foreach ($gradeStats as $stat) {
    echo "年级:{$stat->grade_level},总人数:{$stat->count_total}\n";
}

这里的逻辑和你写的SQL完全一致:select指定要查询的字段和统计函数(给COUNT(*)起别名count_total方便后续访问),group参数对应SQL里的GROUP BY grade_level。查询结果会被映射成School模型对象,所以可以直接通过$stat->grade_level和$stat->count_total访问数据。

方式二:直接返回统计键值对(轻量,仅需统计结果时推荐)

如果你只需要“年级-人数”的关联数组,不需要模型对象的其他功能,可以用count()方法更简洁地实现:

$gradeCounts = School::count([
    'group'  => 'grade_level',
    'select' => 'grade_level'
]);

// 输出结果示例:Array ( [1] => 30 [2] => 28 [3] => 32 )
print_r($gradeCounts);

这个方法返回的是一个关联数组,键是grade_level的取值,值就是对应分组的COUNT(*)结果,非常适合只需要统计数据的场景。

这两种方式都完全基于PHP ActiveRecord的ORM特性,没有手写完整的SQL语句,应该就是你想要的“更直接通过ORM完成”的方案啦~

内容的提问来源于stack exchange,提问作者saladi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:53