当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误
Posted
技术标签:
【中文标题】当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误【英文标题】:Is there any way to fix Illegal offset type error when i try to update the content of pivot table in laravel当我尝试在 laravel 中更新数据透视表的内容时,有什么方法可以解决非法偏移类型错误 【发布时间】:2020-01-06 17:09:00 【问题描述】:我正在尝试更新数据透视表的数据(我想更改订单中的产品)
我有:
-产品表:
id
name
product_price
created_at
updated_at
-订单表:
id
status
user_id
created_at
updated_at
-order_products 表:
order_id
product_id
product_price
count
created_at
updated_at
在订单模型中:
public function product()
return $this->belongsToMany('App\Product')->withPivot('count');
在产品模型中:
public function order()
return $this->belongsToMany('App\Order');
在控制器中:
public function EditOrder(Request $request , $id)
$order = Order::find($id);
$order->status = $request->status;
$order->user_id = $request->user_id;
$order->update();
$product_ids = $request->products;
$selectedItems = [];
foreach ( $product_ids as $key => $productId)
$id1 = $key['product_id'];
$product = Product ::find($id);
$count = $key['count'];
$selectedItems[$productId] = ['product_id' => $id1 ];
$selectedItems[$productId] = ['count' => $count];
$selectedItems[$productId] = ['order_id' => $order->id];
$selectedItems[$productId] = ['price' => $product->product_price];
$order->product()->updateExistingPivot($selectedItems);
return response()->json([
'message' => 'Success'
],200);
我遇到了这个错误:
Illegal offset type in file C:\Users\Acer\Documents\GitHub\easyrest\app\Http\Controllers\ResturantController.php on line 80
我想更新 product_id 并计入 order_products
【问题讨论】:
Laravel 5.4 How to update pivot table?的可能重复 我试过了,还是不行 请告诉我们您的代码中第 80 行在哪里。 $selectedItems[$productId] = ['product_id' => $id1]; 【参考方案1】:updateExistingPivot()
需要 2 个参数,第一个是要更新的关系的 id,第二个是要更新的列数组。您没有传递id
,因此它试图将您的数组用作id
,这就是您收到错误的原因。修正你的逻辑:
foreach($product_ids as $key => $productId)
$id1 = $key['product_id'];
$product = Product::find($id);
$count = $key['count'];
$selectedItems[$productId] = ['product_id' => $id1];
$selectedItems[$productId] = ['count' => $count];
// $selectedItems[$productId] = ['order_id' => $order->id]; // [1]
$selectedItems[$productId] = ['price' => $product->product_price];
$order->product()->updateExistingPivot($productId, $selectedItems[$productId]); // [2]
[1]:可以省略order_id
; $order->product()->updateExistingPivot()
已经知道 order_id
而你没有更新它,所以它是多余的。
[2]:你不想传递整个$selectedItems
数组,只传递$selectedItems[$productId]
中包含的子数组
通过将$productId
作为updateExistingPivot()
的第一个参数传递,Laravel 知道您要更新哪一行,并将使用$selectedItems[$productId]
中的数组键来确定要更新哪些列。我不知道这是否真的会更新product_id
,但如果没有,你可能需要detach()
然后attach()
数据来代替:
foreach($product_ids as $key => $productId)
$selectedItems[$id1] = ['count' => $count];
$selectedItems[$id1] = ['price' => $product->product_price];
$order->products()->detach($productId);
$order->products()->attach($id1, $selectedItems[$id1]);
【讨论】:
以上是关于当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误的主要内容,如果未能解决你的问题,请参考以下文章