Laravel:通过价格支点添加产品尺寸关系

时间:2016-07-08 13:35:56

标签: php laravel laravel-5.2

我现在尝试了一段时间,我似乎无法弄明白。

所以我有一个产品和一个Sizes表,属于很多关系。

所以在我的模型中我有:

public function sizes()
{
    return $this->belongsToMany(Size::class, 'size_product')->withPivot('price');
}

我的表单如下:

My forms looks like this (don't loog at the styles)

我的刀片看起来像这样:

<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中得到这个。

我希望有人可以帮助我。

谢谢!

1 个答案:

答案 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');
}