我有与产品模型有关的凭证模型,用于设置购买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 );
但是我认为这不能使我的代码足够干净,我认为这应该是解决此问题的另一种方法。
答案 0 :(得分:0)
使用filter()
$voucher->buy_products()->sync($request->buy_products->filter());
$voucher->get_products()->sync( $combine->filter());