Laravel中groupBy查询失效求助:按attr_id分组去重
解决Laravel中groupBy报错的问题
嘿,我刚碰到过一模一样的坑!这个报错其实是MySQL严格模式在起作用——当你用GROUP BY分组时,SELECT列表里的字段要么必须出现在GROUP BY子句里,要么得用聚合函数(比如MIN、MAX)包裹,不然MySQL会认为你的查询逻辑不明确,直接拒绝执行。
你原来的代码Attribute::groupBy('attr_id')->get()会尝试取出attr_id和value两个字段,但value既不在GROUP BY里,也没有被聚合处理,所以触发了1055错误。
下面给你几个靠谱的解决方案,按需选就行:
方案1:用聚合函数指定要保留的value
如果你只需要每个attr_id对应的任意一个value(比如第一个、最后一个),可以用聚合函数把value包裹起来:
use Illuminate\Support\Facades\DB; // 取每个attr_id对应的最小value,也可以换成MAX()取最大的 $attrs = Attribute::select('attr_id', DB::raw('MIN(value) as value')) ->groupBy('attr_id') ->get();
方案2:获取每个attr_id对应的最新/最早记录
如果需要每个attr_id对应的最新一条记录(假设表有自增主键id),可以用子查询先拿到每个分组的最大id,再查询对应记录:
$attrs = Attribute::whereIn('id', function ($query) { $query->select(DB::raw('MAX(id)')) ->from('attributes') ->groupBy('attr_id'); })->get();
这个方法性能不错,而且完全符合SQL规范,不会有后续隐患。
方案3:内存中分组处理(小数据量适用)
如果你的数据量不大,可以先把所有数据查出来,再在PHP层面分组取每组的第一条:
$attrs = Attribute::all()->groupBy('attr_id')->map(function ($group) { return $group->first(); });
注意:数据量大的话别用这个,会占用太多内存拖慢性能。
不推荐的方案:关闭MySQL严格模式
虽然修改config/database.php里的strict选项为false能暂时解决报错,但这相当于绕过了SQL的规范约束,长期来看容易埋下逻辑隐患,真心不建议这么做。
内容的提问来源于stack exchange,提问作者Dumitru
相关产品推荐
相关产品推荐

