Laravel 使用 foreach 循环进行批量更新

Laravel Mass update using foreach loop

我试图用同一个外键批量更新记录。但是我遇到了一个问题。如果我使用

 $products = $products::findorfail($prod_id);

它设法更新单个列。然后当我尝试使用

$products = $products::query()->where('product_id', $prod_id)->get();

我遇到了"Method Illuminate\Database\Eloquent\Collection::options does not exist.",我该如何克服这个问题

这是我当前的代码


    public function update(array $data = [],  $prod_id, Variation $products)
    {

        foreach ($data['variants'] as $product) {
            $products = $products::query()->where('product_id', $prod_id)->get();

            $products->options()->detach(($product['option_id']));
            $products->options()->attach(($product['option_id']));
            $products->fill(Arr::set($data, 'product_id', $prod_id));
            $products->fill(Arr::only($product, $products->getFillable()));
        }


        return $products->save();
    }

提前致谢。

您应该将 first() 方法获取到 Product 模型的一个实例,然后将其附加或分离到其他事物。此外,您可以将数组传递给附加或分离方法以创建或删除关系,因此首先收集 id,然后将它们传递给这些方法。

foreach ($data['variants'] as $product) {
    $option_ids[] = $product['option_id'];
}

$product = $products::query()
    ->where('product_id', $prod_id)
    ->first();

$product->options()->detach($option_ids);
$product->options()->attach($option_ids);
$product->fill(Arr::set($data, 'product_id', $prod_id));
$product->fill(Arr::only($product, $product->getFillable()));