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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:15:03