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

Laravel中提取重复foreach循环为独立函数的方案咨询

Laravel重复代码提取优化方案

步骤1:封装重复逻辑为独立方法

在你的类(控制器/服务类)中添加一个私有方法,将两段重复的循环逻辑封装进去:

/**
 * 处理分组订单,创建GroupingOrder及关联的Order实例
 * @param \Illuminate\Support\Collection $groupedOrders 分组后的订单集合
 * @param array $cluster 集群数据
 */
private function processGroupedOrders(\Illuminate\Support\Collection $groupedOrders, array $cluster)
{
    foreach ($groupedOrders as $orders) {
        // 创建GroupingOrder
        $groupingOrder = GroupingOrder::create([
            'cluster_ticket' => $cluster['ticket'],
            'volume'         => $orders->sum('volume'),
            'weight'         => $orders->sum('weight'),
        ]);

        // 遍历创建关联的Order实例
        foreach ($orders as $orderData) {
            Order::create([
                'grouping_order_id'          => $groupingOrder->id,
                'external_id'                => $orderData['id'],
                'hash'                       => $orderData['hash'],
                'latitude'                   => $orderData['latitude'],
                'longitude'                  => $orderData['longitude'],
                'volume'                     => $orderData['volume'],
                'weight'                     => $orderData['weight'],
                'visit_time'                 => $orderData['visitTime'],
                'pickup_time'                => $orderData['timePickup'],
                'delivery_time'              => $orderData['timeDelivery'],
                'minutes_per_order_pickup'   => $orderData['minutesPerOrderPickup'],
                'minutes_per_order_delivery' => $orderData['minutesPerOrderDelivery'],
                'minutes_per_item_pickup'    => $orderData['minutesPerItemPickup'],
                'minutes_per_item_delivery'  => $orderData['minutesPerItemDelivery'],
                'time'                       => $orderData['time'],
                'risk'                       => $orderData['risk'],
            ]);
        }
    }
}

步骤2:替换原重复代码

将原来两段重复的foreach循环,替换为调用上述方法:

// 处理hash分组的订单
$this->processGroupedOrders($groupHash, $cluster);

// 处理经纬度分组的订单
$this->processGroupedOrders($groupLatLong, $cluster);

额外优化建议

  • 变量命名优化:将原循环中的$order改为$orderData,避免和创建后的Order实例重名,提升代码可读性
  • 批量创建优化:如果每组订单数量较多,可以考虑用Order::insert()批量插入,减少数据库查询次数,提升性能(注意批量插入不会触发模型事件):
// 替换内部foreach为批量插入
$orderRecords = $orders->map(function ($orderData) use ($groupingOrder) {
    return [
        'grouping_order_id'          => $groupingOrder->id,
        'external_id'                => $orderData['id'],
        'hash'                       => $orderData['hash'],
        // ... 其他字段同上
        'risk'                       => $orderData['risk'],
    ];
})->toArray();

Order::insert($orderRecords);

内容的提问来源于stack exchange,提问作者Shirley Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:05:19