Laravel Eloquent分组查询报错:supplies.name不在GROUP BY中
解决Laravel Eloquent GROUP BY 1055错误问题
错误原因
你遇到的SQLSTATE[42000]: 1055错误,是因为MySQL的ONLY_FULL_GROUP_BY sql模式要求:SELECT语句中的非聚合字段必须出现在GROUP BY子句中。你的原生SQL能正常执行,说明你的MySQL服务器默认没开启这个模式,但Laravel默认在数据库配置中启用了严格模式(strict: true),会强制开启ONLY_FULL_GROUP_BY,所以Eloquent查询触发了错误。
三种解决方案
方案一:规范Eloquent查询(推荐)
把SELECT里所有非聚合的字段都加入GROUP BY,比如假设supplies表的主键是id,写法如下:
$supplyStockOuts = Supply::select( 'supplies.id', 'supplies.name', DB::raw('SUM(stock_outs.quantity) as total_stock_out') ) ->join('stocks', 'supplies.id', '=', 'stocks.supply_id') ->join('stock_outs', 'stocks.id', '=', 'stock_outs.stock_id') ->groupBy('supplies.id', 'supplies.name') ->get();
这种写法完全符合SQL规范,不会破坏严格模式的校验,也能避免潜在的逻辑问题。
方案二:临时关闭当前查询的严格模式
如果不想调整GROUP BY字段,可以在查询前后临时修改sql_mode:
// 临时移除ONLY_FULL_GROUP_BY DB::statement("SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));"); // 执行你的统计查询 $supplyStockOuts = Supply::select( 'supplies.name', DB::raw('SUM(stock_outs.quantity) as total_stock_out') ) ->join('stocks', 'supplies.id', '=', 'stocks.supply_id') ->join('stock_outs', 'stocks.id', '=', 'stock_outs.stock_id') ->groupBy('supplies.id') ->get(); // 恢复原sql_mode DB::statement("SET sql_mode=(SELECT CONCAT(@@sql_mode, ',ONLY_FULL_GROUP_BY'));");
方案三:全局关闭Laravel严格模式(不推荐)
修改config/database.php中的MySQL配置,把strict设为false:
'mysql' => [ // ...其他配置项 'strict' => false, ],
这种方法虽然简单,但会关闭所有SQL严格校验,可能导致一些隐性的SQL逻辑错误,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Jahangir Shah
相关产品推荐
相关产品推荐

