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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:57:27