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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:24:59