В вашем цикле, когда вы получаете $ вариантов из базы данных, вы получаете коллекцию вашего ProductVariant (отношение один ко многим), и именно поэтому вы получаете ошибку «Метод Collection :: update не существует.».Laravel get () возвращает коллекцию ProductVariant.
Похоже, вы хотите обновить все product_variants, принадлежащие одному продукту, с тем же именем и ценой.Поэтому лучше, чтобы вы вывели product_variants за пределы цикла, а затем выполняли цикл по полученной коллекции.
$product = Product::findOrFail($id);
$product->name = $request->product_name;
$product->update();
$variants = ProductVariant::where('product_id',$id)->get(); // This return a collection of ProductVariant
foreach ($variants as $variant) {
$variant->variant_name = $request->variant_name;
$variant->variant_price = $request->variant_price;
$variant->update();
}
Но, если вам нужно обновить варианты одного продукта с другими названиями и ценами, которые вы получаете по вашему запросу, сначала вам нужно изменить атрибут имени текстового ввода в html:
<input id="product_name" type="text" name="variant_name_{{$variant->id}}" value=" {{ $variant->variant_name }}" required autofocus>
<input id="product_name" type="text" name="variant_price_{{$variant->id}}" value=" {{ $variant->variant_price }}" required autofocus>
Тогда в вашем коде:
$product = Product::findOrFail($id);
$product->name = $request->product_name;
$product->update();
$variants = ProductVariant::where('product_id',$id)->get(); // This return a collection of ProductVariant
foreach ($variants as $variant) {
$nameIdentifier = "variant_name_" . $variant->id;
$priceIdentifier = "variant_price_" . $variant->id;
$variant->variant_name = $request->$nameIdentifier;
$variant->variant_price = $request->$priceIdentifier;
$variant->update();
}
Кроме того, так как вы хотите, чтобы в вашем запросе был набор операций, я предпочитаю идти с транзакцией базы данных.В этом случае, если что-то пойдет не так во время операций, вы можете спокойно откатиться.https://laravel.com/docs/5.7/database#database-transactions
Надеюсь, это поможет:)