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
相关产品推荐
相关产品推荐

