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
相关产品推荐
相关产品推荐

