resolveCart(); $existing = $cart->products()->wherePivot('product_id', $request->product_id)->first(); if ($existing) { $cart->products()->updateExistingPivot($request->product_id, [ 'quantity' => $existing->pivot->quantity + 1, ]); } else { $cart->products()->attach($request->product_id, ['quantity' => 1]); } return response()->json($this->cartItems($cart)); } public function update(UpdateCartRequest $request, Product $product): JsonResponse { $cart = $this->resolveCart(); $cart->products()->updateExistingPivot($product->id, [ 'quantity' => $request->quantity, ]); return response()->json($this->cartItems($cart)); } public function destroy(Request $request, Product $product): JsonResponse { $cart = $this->resolveCart(); $cart->products()->detach($product->id); return response()->json($this->cartItems($cart)); } private function resolveCart(): Cart { $cartId = session('cart_id'); if ($cartId) { $cart = Cart::find($cartId); if ($cart) { return $cart; } } $cart = Cart::create(['user_id' => request()->user()?->id]); session(['cart_id' => $cart->id]); return $cart; } /** * @return array */ private function cartItems(Cart $cart): array { return $cart->products()->get()->map(fn ($p) => [ 'product_id' => $p->id, 'quantity' => $p->pivot->quantity, ])->all(); } }