Laravel - 使用额外列保存到多个与多个关系的数据透视表

时间:2018-01-18 14:46:50

标签: php laravel

我有模型TransactionOption,它们有很多关系。数据透视表transaction_options包含transaction_idoption_idprice列。 我在模型中定义了这样的关系:

交易型号:

public function options()
{
    return $this->belongsToMany('App\Option', 'transaction_options')->withPivot('price');
}

选项型号:

public function transactions()
{
    return $this->belongsToMany('App\Transaction', 'transaction_options')->withPivot('price');
}

我想知道如何在数据透视表中保存一些东西,我尝试过类似的东西,但它无法正常工作:

   foreach($data->options as $option) {
        $transaction->options()->create([
            'transaction_id' => $transaction->id,
            'extras_id'      => $option->extraId,
            'option_id'      => $option->id,
            'price'          => $option->price
        ]);
    }

我该怎么做?

3 个答案:

答案 0 :(得分:5)

将额外字段作为值附加到附加功能

$transaction->options()->attach([$request['id'] => ['price' => $request['price']]]);

答案 1 :(得分:0)

https://laravel.com/docs/master/eloquent-relationships#updating-many-to-many-relationships

从我所看到的,您应该使用这样的代码:

foreach ($data->options as $option) {
    $transaction->options()->attach($option->id, ['price' => $option->price])
}

答案 2 :(得分:0)

您可以将透视数据作为第二个参数传递:

foreach($data->options as $option) {
    $transaction->options()->create(
        ['extras_id' => $option->extraId],
        ['price' => $option->price]
    );
}

您也不需要同时传递transaction_idoption_id,它们会自动插入。