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()));
我试图用同一个外键批量更新记录。但是我遇到了一个问题。如果我使用
$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()));