Laravel 5.4更新数据透视表中的现有记录

时间:2017-08-03 12:28:49

标签: php mysql laravel eloquent

我在Laravel 5.4中有一个现有的数据透视表,它存储了属于订单的所有产品,名为 order_product

我在OrderController中使用“update()”方法来更新订单并更新属于订单的任何产品。

public function update(Request $request)
{
    $order = Order::updateOrCreate(['woo_order_id' => $request->input('id')]);
    $order->woo_order_id = $request->input('id');
    $order->woo_order_date = $request->input('date_created');

    // loop through each item of the order and add to pivot table order_product
    //$order->products()->detach();
    foreach($request->input('line_items') as $item) 
    {
        $order->products()->updateExistingPivot($item['product_id'], [
            'order_id' => $request->input('id'),
            'qty'      => $item['quantity'],
        ], false);
    }
}

创建/更新订单后,我会循环浏览订单中的每个订单项,以按顺序更新任何添加/删除/更改的产品。

我试过了:

$order->products()->detach($item['product_id']); // inside the foreach loop 

删除所有关联的行并重新写入更新的行以避免重复的输入错误,然后运行:

$order->products()->attach($item['product_id'], [
            'order_id' => $request->input('id'),
            'qty'      => $item['quantity'],
        ]);

我也试过了:

$order->products()->updateExistingPivot($item['product_id'], [
            'order_id' => $request->input('id'),
            'qty'      => $item['quantity'],
        ], false);

在foreach循环内部,因为此方法仅更新现有订单。

我也尝试过添加:

$order->save($order);

抛出错误告诉我需要将数组传递给save()方法。

我已经完成了可能出错的想法。

更新

使用sync()函数也无济于事。

$order->products()->sync([$item['product_id'] => [
            'order_id' => $request->input('id'),
            'qty'      => $item['quantity'],
        ]]);

1 个答案:

答案 0 :(得分:0)

怀疑你仍然有这个问题,但只是生病了:

1:您不需要在更新时创建表的新实例,并将其作为参数传递给您的函数。

2:使用包含在if

中的同步 syncWithoutDetaching

按如下方式更改您的功能:

 public function update(Order $order,Request $request)
{
   $order::where('id',$order->id)([
   'woo_order_id' => $request->input('id'),
   'woo_order_date' => $request->input('date_created')
   ]);

   // loop through each item of the order and add to pivot table order_product
   $item = 0;
   foreach($request->input('line_items') as $item) 
   {

      if($item == 0){

         $order->products()->sync(

         $item['product_id'] => [
         'order_id' => $request->input('id'),
         'qty'      => $item['quantity'],
         ]);
      }
      else{

         $order->products()->syncWithoutDetaching(

         $item['product_id'] => [
         'order_id' => $request->input('id'),
         'qty'      => $item['quantity'],
         ]);

      }
      $i++;
   }
}

这应该允许您更新而不会获得任何重复记录。希望这有助于=)