当我尝试在 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 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与数据透视表的关系,关系?

我应该如何为需要引用数据透视表的表配置 Laravel / OctoberCMS 模型?

Laravel 如何创建数据透视表?

如何在同一资源LARAVEL中返回数据透视表的数据

使用 Laravel 数据透视表的多行和多列输入表单

在 laravel 中使用多对多关系同步:PostgreSQL 数据透视表不更新