我现在尝试了一段时间,我似乎无法弄明白。
所以我有一个产品和一个Sizes表,属于很多关系。
所以在我的模型中我有:
public function sizes()
{
return $this->belongsToMany(Size::class, 'size_product')->withPivot('price');
}
我的表单如下:
我的刀片看起来像这样:
<h2 class="fields-holder__title">Sizes</h2>
@foreach($sizes as $size)
<div class="field-holder__container">
<input type="checkbox" name="sizes[]" value="{{ $size->id }}">
<input type="text" name="prices[]" placeholder="Price">
</div>
@endforeach
在我的控制人员的帖子中我做了:
// add and remove sizes pivot
$sizes = [];
foreach ($request->sizes as $size) {
array_push($sizes, $size);
}
$product->sizes()->sync($sizes);
但我如何保存价格?
我知道你可以在Laravel中做到这一点:
$product->sizes()->sync($size, ['price' => $price]);
但我如何在foreach中得到这个。
我希望有人可以帮助我。
谢谢!
答案 0 :(得分:1)
首先,使用相应尺寸/价格保存产品的逻辑不属于您的控制器,而是属于您的模型(或某些中间数据层)。
至于你的问题:你只能将枢轴关系保存到已经有id的记录,即。已保存到数据库的一个。此外,belongsToMany类上的sync()
方法用于通过id保存多个关系,并接受布尔值作为第二个参数(是否分离,默认为true)。
在这种情况下,您应该对大小数组进行预测,每个大小attach()
,以及它的价格,到父模型。像这样:
ProductsController.php
public method store(Request $request)
{
// call the create method on the model
$product = Product::createForSizes(
$request->only('name', 'sizes', 'prices')
);
return $product
? redirect()->route('some.route')
: redirect()->route('some.other.route');
}
Product.php
public static method createForSizes($name, array $sizes, array $prices)
{
// create and save a new instance of the model
if(!$product = static::create(compact('name'))) {
return false;
}
// attach each size, with it's price
foreach($sizes as $index => $id) {
$price = isset($prices[$index]) ? $prices[$index] : null;
$product->sizes()->attach($id, compact('price'));
}
return $product;
}
注意:如果您按字母顺序将其命名为复数,Laravel会自动查找数据透视表。因此,如果您将数据透视表命名为 products_sizes ,则可以省略关系方法中的表名,如下所示:
public function sizes()
{
return $this->belongsToMany(Size::class)->withPivot('price');
}