Laravel 8 基于darryldecode购物车包已存在商品数量更新问题
问题根源
你当前的代码逻辑存在判断顺序错误:在遍历购物车商品时,每遇到一个ID不匹配的商品,就会执行一次新增操作。比如购物车已存在商品A、B,你再次添加商品A:遍历到A时会更新数量,遍历到B时ID不匹配,就会触发else分支,把A作为新商品插入购物车,这就是问题出现的核心原因。
修正后的代码
public function store(CartStoreRequest $request) { $validated = $request->validated(); $product = Product::findOrFail($validated['product_id']); $rowId = uniqid(); $userID = $validated['user_id']; // 获取当前用户购物车 $currentCart = \Cart::session($userID); $cartContent = $currentCart->getContent(); $exists = false; // 先遍历判断商品是否已存在 foreach($cartContent as $item) { $productID = $item->associatedModel->id; if($productID === $product->id) { // 商品已存在,更新数量 $currentCart->update($item->id, [ 'quantity' => [ 'relative' => false, 'value' => $product->minStock($item->quantity + $validated['quantity']), ] ]); $exists = true; break; // 找到匹配项直接跳出循环,无需继续遍历 } } // 仅商品不存在时才执行一次新增 if(!$exists) { $currentCart->add(array( 'id' => $rowId, 'name' => $product->name, 'price' => $product->price->amount(), 'quantity' => $validated['quantity'], 'associatedModel' => $product, 'attributes' => array( 'first_image' => $product->firstImage, 'formatted_price' => $product->formattedPrice, 'product_stock' => $product->stockCount() ) )); } return redirect()->back(); }
核心调整说明
- 新增
$exists标志位,先遍历购物车判断商品是否已存在,存在则直接更新数量 - 遍历结束后再统一判断:如果商品不存在,才执行一次新增操作,避免循环内重复插入
- 移除了循环内的else新增分支,避免误触发
- 匹配到对应商品后直接跳出循环,减少不必要的遍历开销
内容的提问来源于stack exchange,提问作者wise1999
相关产品推荐
相关产品推荐

