我在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'],
]]);
答案 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++;
}
}
这应该允许您更新而不会获得任何重复记录。希望这有助于=)