yii2中可用active record的count()、sum()、average()、min()、max()方法快速统计;count()传字段名排除null,sum()支持expression计算,average/min/max为空时返回null。

要在Yii2项目中快速获取数据库表的记录总数、某字段的总和或平均值,不用写原生SQL也能精准拿到结果,关键是选对Active Record的统计方法并传入正确的参数。
用count()统计行数
直接调用count()就能返回整张表或满足条件的记录条数,但要注意字段参数是否传了——不传参数等价于count(*),传了字段名则自动忽略NULL值。
第一步:统计user表全部记录数
Customer::find()->count();
第二步:统计status为1的用户数量
Customer::find()->where(['status' => 1])->count();
第三步:统计email字段非NULL的记录数(排除空邮箱)
Customer::find()->count('email');【必须传字符串字段名,不能传数组或表达式】
这一步容易出错:如果写成Customer::find()->count(['email'])会报错,框架不支持数组形式的字段参数。
用sum()计算数值字段总和
sum()只接受数值型字段,常用于订单金额、积分、库存数量等累加场景。它会自动跳过NULL值,但不会过滤0值。
方法一:查所有订单金额总和
Order::find()->sum('amount');
方法二:查指定状态的订单金额总和
Order::find()->where(['status' => 'paid'])->sum('amount');
方法三:带表达式计算(如乘以税率)
Order::find()->sum(new \yii\db\Expression('amount * 1.1'));【Expression必须用new实例化,字符串写法无效】
用average()、min()、max()获取单值统计
这三个方法用法高度一致,都要求字段存在且类型兼容——average只能用于数字列,min/max对字符串按字典序比较。
Customer::find()->average('age');
Customer::find()->min('created_at');
Customer::find()->max('score');
注意:如果查询结果为空,average()、min()、max()返回null,不是0或false。需要自行判断是否为空再做后续处理。











