Laravel 6:具有批量插入关系的批量插入

Laravel 6:具有批量插入关系的批量插入,laravel,eloquent,laravel-6,Laravel,Eloquent,Laravel 6,我有餐桌行程,餐点和行程 行程与用餐表有多对多关系 当dd($request->all())时,它向我提供以下值: "product_itineraries" => array:3 [▼ 1 => array:6 [▼ "itinerary_title_en" => "123123" "itinerary_title_th" => "123123&qu

我有餐桌
行程
餐点
行程

行程
用餐
表有多对多关系

dd($request->all())
时,它向我提供以下值:

"product_itineraries" => array:3 [▼
    1 => array:6 [▼
      "itinerary_title_en" => "123123"
      "itinerary_title_th" => "123123"
      "day_number" => "1"
      "itinerary_description_en" => null
      "itinerary_description_th" => null
      "meal_type_id" => array:3 [▼
        0 => "1"
        1 => "2"
        2 => "3"
      ]
    ]
我可以批量插入行程,如:

foreach ($request->product_itineraries as $product_itinerariesKey => $product_itineraries) {
    if (empty($product_itineraries)) {
        continue;
    }
    $productItineraryData[$product_itinerariesKey]['meal_type_id'] = $product_itineraries['meal_type_id'];
    $productItineraryData[$product_itinerariesKey]['product_id'] = $product->id;
    $productItineraryData[$product_itinerariesKey]['itinerary_title_en'] = $product_itineraries['itinerary_title_en'];
    $productItineraryData[$product_itinerariesKey]['itinerary_title_th'] = $product_itineraries['itinerary_title_th'];
    $productItineraryData[$product_itinerariesKey]['day_number'] = $product_itineraries['day_number'];
    $productItineraryData[$product_itinerariesKey]['itinerary_description_en'] = $product_itineraries['itinerary_description_en'];
    $productItineraryData[$product_itinerariesKey]['itinerary_description_th'] = $product_itineraries['itinerary_description_th'];
    $productItineraryData[$product_itinerariesKey]['created_at'] = $nowTime;
    $productItineraryData[$product_itinerariesKey]['updated_at'] = $nowTime;
}

if (!empty($productItineraryData) && count($productItineraryData) > 0) {
    ProductItinerary::insert($productItineraryData);
}
使用它,我现在无法批量插入相关的用餐类型,因为我没有产品行程id。 此外,我没有得到产品行程的模型,因此无法使用Founds()关系保存


大容量插入模型及其关系有什么解决方案吗?

我对您的数据结构和表/列名做了一些假设,请告诉我这是否实现了您想要的大容量插入:

$itineraries = [];
$relatedMeals = [];

foreach ($request->product_itineraries as $product_itinerariesKey => $product_itineraries) {
    if (empty($product_itineraries)) {
        continue;
    }

    $itinerary['product_id'] = $product->id;
    $itinerary['itinerary_title_en'] = $product_itineraries['itinerary_title_en'];
    $itinerary['itinerary_title_th'] = $product_itineraries['itinerary_title_th'];
    $itinerary['day_number'] = $product_itineraries['day_number'];
    $itinerary['itinerary_description_en'] = $product_itineraries['itinerary_description_en'];
    $itinerary['itinerary_description_th'] = $product_itineraries['itinerary_description_th'];
    $itinerary['created_at'] = $nowTime;
    $itinerary['updated_at'] = $nowTime;

    $itineraries[] = $itinerary;
    $relatedMeals[] = $product_itineraries['meal_type_id'];
}

DB::beginTransaction();

try {
    $itineraryId = ProductItinerary::sharedLock()->max('id') + 1;
    ProductItinerary::insert($itineraries);

    $relations = [];
    foreach ($relatedMeals as $mealIds) {
        foreach ($mealIds as $mealId) {
            $relations[] = [
                'product_itinerary_id' => $itineraryId,
                'meal_id' => $mealId,
            ];
        }
        $itineraryId++;
    }

    DB::table('product_itinerary_meal')->insert($relations);

    DB::commit();
} catch(Exception $e) {
    DB::rollback();
    throw $e;
}

考虑“插入”()作为@ KurtFrasar,它提供了一个错误,当使用<代码> INSERTTGETED($AudioTrimeRealDATA)时,<代码>数组到字符串转换当<代码> INSERT($OptudiTrimaDATA)< /C> >工作良好。我遗漏了什么吗?我不认为insertGetId适用于bulk insert@KurtFriarsYou是正确的。我的任命。这里使用db事务的有趣解决方案。基本上,一旦知道插入的第一个id和插入的记录数,就知道所有id。是的@KurtFriars,这似乎是解决方案之一。非常感谢。但在我的例子中,请求具有针对单个模型的嵌套数组,因此同时提取相关id和嵌套数组有点困难。似乎我找到的合理解决方案是在这种情况下不使用批量插入。没问题。很高兴我能帮忙@LizeshShakya请看我在上面的查询生成器中添加了sharedLock方法的地方,我昨晚在考虑这个问题,似乎事务不会锁定表。看见