Laravel多表查询分组order_delivery_zone时生成重复对象求助
问题原因
你当前的重复分组是因为嵌套循环中每次单独查询Order并分组:如果多个不同的order_list_id对应的订单同属一个order_delivery_zone,每轮循环都会生成一个该分组的对象,最终结果就会出现重复。
解决方法
方法1:先收集所有订单再统一分组
把所有需要的订单先收集到一个集合中,最后一次性按order_delivery_zone分组,避免多次分组导致重复:
// 批量获取所有关联的order_id $orderIds = DocketList::query() ->groupBy('order_list_id') ->pluck('order_list_id') ->flatMap(function ($orderListId) { return OrderList::where('id', $orderListId)->pluck('order_id'); }); // 统一查询订单并分组 $groupedOrders = Order::whereIn('id', $orderIds) ->get() ->groupBy('order_delivery_zone');
这样订单269和270会被统一归到分组“2”下,不会产生重复分组。
方法2:用模型关联一次性拉取数据
如果三个表已定义关联关系,可通过关联查询直接获取所有数据再分组,同时减少数据库查询次数:
先定义模型关联
DocketList模型:
public function orderList() { return $this->belongsTo(OrderList::class, 'order_list_id'); }
OrderList模型:
public function order() { return $this->belongsTo(Order::class, 'order_id'); }
关联查询并分组
$groupedOrders = DocketList::query() ->with('orderList.order') ->groupBy('order_list_id') ->get() ->pluck('orderList.order') ->filter() // 过滤空订单(如果存在) ->groupBy(function ($order) { return $order->order_delivery_zone; });
内容的提问来源于stack exchange,提问作者Mizy
相关产品推荐
相关产品推荐

