如何在Laravel Eloquent中实现关联分组统计并解决GROUP BY字段报错问题
问题根因
你的报错是Laravel默认开启了MySQL的ONLY_FULL_GROUP_BY严格模式导致的:
- 该模式要求SELECT子句中所有非聚合类型的列,必须全部出现在GROUP BY子句中
- 你编写的Eloquent代码没有指定SELECT字段,默认会查询两张关联表的全部字段,绝大部分字段都不在GROUP BY配置里,所以触发报错
- phpMyAdmin默认关闭了该严格模式,所以不符合规范的原生SQL可以正常执行
最优修复方案
明确指定你需要查询的字段,同时把SELECT中的非聚合列都放到GROUP BY中即可。因为llamada_estado.id是表主键,和estadisticas.id_estado一一对应,添加llamada_estado.desc到GROUP BY不会影响统计结果。
首先引入DB门面:
use Illuminate\Support\Facades\DB;
修改后的查询代码:
$query2 = Estadisticas::query() ->select('llamada_estado.desc', DB::raw('count(estadisticas.id_estado) as estado_count')) ->whereDate('updated_at', '<=', $toDate) ->whereDate('updated_at', '>=', $fromDate) ->join('llamada_estado', 'estadisticas.id_estado', '=', 'llamada_estado.id') ->groupBy('estadisticas.id_estado', 'llamada_estado.desc') ->get();
查询结果中每个条目会包含desc(状态描述)和estado_count(对应状态的统计数量)两个字段,和你原生SQL的返回结果完全一致。
小优化:时间范围过滤也可以直接用
whereBetween写法更简洁:->whereBetween('updated_at', [$fromDate, $toDate])
可选方案(不推荐)
如果你不需要严格模式校验,可以修改项目config/database.php文件中MySQL配置项,将strict的值改为false,即可直接运行你原来的Eloquent代码。但严格模式可以避免很多隐性的数据错误,不建议关闭。
内容的提问来源于stack exchange,提问作者scorpions78
相关产品推荐
相关产品推荐

