Laravel框架distinct()搭配get()查询时去重失效问题
问题原因
Laravel查询构造器的distinct()方法原生设计就不接收字段参数:
- 你之前写的
distinct('product_id')->count()能得到正确结果,是因为count方法底层自动把你误传给distinct的product_id拿过去当统计字段了,最终生成的SQL是SELECT COUNT(DISTINCT product_id) FROM order_items WHERE order_id IN (...),自然能算出正确的去重统计值2。 - 但换成
get()取结果集的时候,你传给distinct的参数会被直接丢弃,最终执行的SQL是SELECT DISTINCT * FROM order_items WHERE order_id IN (...),这个语法是对整行所有字段做组合去重,只要两行记录有任意一个字段值不一样,就会被判定为不重复,所以会把所有匹配的记录都返回来,根本不会按product_id去重。
正确写法
要拿到按product_id去重的结果集,选下面任意一种写法即可:
- 写法1:指定查询字段+无参distinct
$customers_id = Order::where('user_id', $id)->pluck('id'); $customers = OrderItem::whereIn('order_id', $customers_id) ->select('product_id') // 要查其他字段直接往select里追加即可,比如select('product_id', 'sku', 'price') ->distinct() ->get();
- 写法2:用groupBy按字段分组实现去重
$customers_id = Order::where('user_id', $id)->pluck('id'); $customers = OrderItem::whereIn('order_id', $customers_id) ->groupBy('product_id') ->get();
提醒:如果项目开启了MySQL严格模式,用groupBy的时候要保证select里查询的字段都在groupBy的字段列表里,不然会报ONLY_FULL_GROUP_BY相关的SQL错误,按需调整查询字段或者修改数据库strict配置即可。
内容的提问来源于stack exchange,提问作者faisal mumtaz
相关产品推荐
相关产品推荐

