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

Eloquent实现GROUP BY分组求AVG平均值时报错的技术咨询

解决Eloquent中聚合函数查询的列未找到错误

嘿,我来帮你搞定这个问题!你遇到的报错原因很清晰:Eloquent 默认会把你传入select()的字符串当作普通列名处理,它并没有识别出AVG(value) as avg是一个SQL聚合函数表达式,所以才会抛出“找不到列'AVG(value)'”的错误。

正确的写法

要让Eloquent把这段聚合逻辑当作原生SQL片段执行,你有两种简洁的处理方式:

方法1:使用DB::raw()包裹聚合表达式

Vote::select(DB::raw('AVG(value) as avg'))->groupBy('project_id')->get();

方法2:使用selectRaw()(推荐,代码更直观)

Vote::selectRaw('AVG(value) as avg')->groupBy('project_id')->get();

补充:如果需要保留原SQL中的SELECT *

如果你想要和原SQL一样查询所有字段+平均值,这里要额外提一句:在开启ONLY_FULL_GROUP_BY模式的MySQL环境中,SELECT *配合GROUP BY会触发报错(因为非聚合列没有出现在GROUP BY子句中),所以更稳妥的方式是明确指定需要的列,比如:

// 推荐:明确指定字段 + 聚合值
Vote::select('project_id', DB::raw('AVG(value) as avg'))->groupBy('project_id')->get();

// 仅适用于关闭ONLY_FULL_GROUP_BY的场景(不推荐)
Vote::select('*', DB::raw('AVG(value) as avg'))->groupBy('project_id')->get();

这样修改后,Eloquent就会正确生成你想要的SQL语句,不会再出现列未找到的错误啦。

内容的提问来源于stack exchange,提问作者mastrobirraio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:49