Laravel 8调用groupBy按group字段分组报1055错误如何解决
问题场景
PHP 7.4 环境下运行 Laravel 8 项目,现有add_ons数据表及对应Addon模型,模型包含group字段,期望通过该字段将对应行数据分组归集到同一对象下,调用模型的groupBy方法时抛出如下错误:
语法错误或访问冲突:1055 SELECT列表的第1个表达式不在GROUP BY子句中,且包含非聚合列'domainmonitor_db.add_ons.id',该列与GROUP BY子句中的列不存在函数依赖关系
原实现代码:
/** * Handle the incoming request. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function __invoke(Request $request) { $addons = Addon::groupBy('group')->get(); }

错误原因
这里的核心问题是混用了两种完全不同的groupBy逻辑:
- 直接在模型查询链式调用中写
groupBy('group'),属于SQL层面的分组聚合,会直接在生成的SQL语句中拼接GROUP BY 'group'。MySQL默认开启ONLY_FULL_GROUP_BY模式,要求SELECT返回的所有非聚合字段必须包含在GROUP BY子句中,而Laravel默认会查询表的全部字段(包括id、创建时间等未出现在GROUP BY规则中的字段),因此触发1055语法错误。 - 实际需求是将查询出的所有记录按
group字段归类归集,属于拿到查询结果后对结果集的分组处理,不需要在SQL查询阶段做分组。
修复方案
方案1(推荐,完全匹配归集需求)
先查询全量Addon记录,再调用Laravel集合提供的groupBy方法对结果集做分组,完全不会触发SQL语法错误:
public function __invoke(Request $request) { $addons = Addon::get()->groupBy('group'); }
最终返回的结果会以group字段值为键,对应分组下的所有Addon模型集合为值,直接满足同组数据归集到同一对象下的需求。
方案2(仅适用于SQL聚合场景,不推荐用于全量记录归集)
如果你确实需要在SQL层面做分组统计类操作,可选择以下任意一种处理方式:
- 遵循SQL GROUP BY语法规范,手动指定查询字段,仅返回GROUP BY包含的字段和聚合计算字段:
$addons = Addon::select('group', \DB::raw('COUNT(id) as addon_count')) ->groupBy('group') ->get();
- 关闭MySQL的
ONLY_FULL_GROUP_BY校验(生产环境不推荐,会破坏SQL语义严谨性,易出现不可预期的查询结果):
修改项目config/database.php文件中mysql连接的modes配置,移除ONLY_FULL_GROUP_BY项:
修改完成后执行'mysql' => [ // 其余数据库配置项保持不变 'modes' => [ 'STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_DIVISION_BY_ZERO', 'NO_ENGINE_SUBSTITUTION', // 删除原本存在的 'ONLY_FULL_GROUP_BY' 配置 ], ],php artisan config:clear清除配置缓存即可生效。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

