Laravel 6与Pivot的同步关系

时间:2019-12-10 10:21:24

标签: laravel pivot relationship

我有与产品模型有关的凭证模型,用于设置购买x得到y功能,下面的代码

class Voucher extends Model
{
    /**
     * The buy products that belong to the voucher.
     */
    public function buy_products()
    {
        return $this->belongsToMany( 'App\Models\Product', 'voucher_products', 'voucher_id', 'product_id' )->wherePivot( 'type', 'buy' );
    }

    /**
     * The get products that belong to the voucher.
     */
    public function get_products()
    {
        return $this->belongsToMany( 'App\Models\Product', 'voucher_products', 'voucher_id', 'product_id' )->wherePivot( 'type', 'get' );
    }
}

在VoucherController方法更新中,我使用同步功能来保存Voucher与产品表/模型之间的关系,像这样

$voucher->buy_products()->sync( $request->buy_products );
$voucher->get_products()->sync( $request->get_products );

错误结果显示如下

Not null violation: 7 ERROR: null value in column "type" violates not-null constraint
DETAIL: Failing row contains (1, 2, null).
(SQL: insert into "voucher_products" ("product_id", "voucher_id") values (2, 1))

我的结论是,在我的关系设置中,同步方法未包含wherePivot( 'type', 'buy' )功能。

我得到了解决问题的答案,方法是使用类似这样的附加属性更新输入数组

$fill = array_fill( 0, count( $request->get_products ), [
    'type' => 'get'
] );
$combine = array_combine( $request->get_products, $fill );
$voucher->get_products()->sync( $combine );

但是我认为这不能使我的代码足够干净,我认为这应该是解决此问题的另一种方法。

1 个答案:

答案 0 :(得分:0)

使用filter()

$voucher->buy_products()->sync($request->buy_products->filter());

$voucher->get_products()->sync( $combine->filter());