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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:34