我有一个产品表,用户可以添加产品到购物车通过选择复选框多个产品。 问题在于一对多关系同步。
我的购物车型号:
protected $fillable = [
'currency',
'price',
'user_id',
];
//Table Names
protected $table = 'carts';
public function product()
{
return $this->belongsToMany(Product::class);
}
我的产品型号:
public function carts()
{
return $this->hasMany(Cart::class);
}
我的cart_products数据表
cart_id and product_id
当我将多个产品保存到购物车时,它会被添加,并且只与最后的cart_id同步。 所有product_id都正确。
我的CartController:
public function store(Request $request)
{
$this->validate($request, [
'product_id' => 'required',
'currency' => '',
'price' => '',
]);
$user = Auth::user()->id;
$product_id = $request->product_id;
// dd($product_id);
foreach($product_id as $cart) {
// dd($cart[0]);
$cart = Cart::create([
'currency' => $request['currency'],
'price' => $request['price'],
'user_id' => $user,
]);
}
$cart->product()->sync($product_id);
return redirect()->back()->with('toast_success', 'Item(s) added in cart');
}
我还需要帮助了解如何正确同步cart_id。
使用sync可以删除参数中没有的所有关系。 有一种在不删除旧关系的情况下进行同步的方法SyncWithoutDetaching()
。
改变电话,可以帮助你不解除旧关系。 你只需要考虑他们如何从购物车中移除物品。
$cart->product()->syncWithoutDetaching($product_id);
难怪,因为同步产品关系是在循环之外的,为什么它只设置为最后一辆车。 将同步移入循环,如下所示:
foreach($product_id as $cart) {
$cart = Cart::create([
'currency' => $request['currency'],
'price' => $request['price'],
'user_id' => $user,
]);
$cart->product()->sync($product_id);
}