Laravel中session push向购物车商品追加addon_id异常问题
问题根因
Laravel的session()->push()方法支持的点语法,是直接按数组键名匹配层级的。你写的session()->push('cart.addons', $request->addon_id),会直接在cart数组的最外层创建/追加addons键的值,完全不会定位到具体商品ID对应的子项内的addons数组,这就是所有附加项都被存到购物车最外层、和商品项平级的原因。
修复方法
直接替换原有追加附加项的代码即可,不要用点语法做动态定位,先取出完整购物车数组,操作对应商品的子项后再存回session:
if(isset($request->item_id) && isset($request->addon_id)) { // 取出完整购物车数据 $cart = session()->get('cart', []); // 校验对应商品存在于购物车中再执行操作 if(isset($cart[$request->item_id])) { // 追加前做去重判断,避免同一个附加项重复存入 if(!in_array($request->addon_id, $cart[$request->item_id]['addons'])) { $cart[$request->item_id]['addons'][] = $request->addon_id; } // 把修改后的购物车存回session session()->put('cart', $cart); } } $cart = session()->get('cart', []); return response()->json([ 'message' => 'Addon added', 'cart' => $cart, ]);
额外优化建议
- 补充参数校验:只有同时传入
item_id和addon_id时才执行追加逻辑,避免空值触发报错 - 补充商品存在校验:操作前先判断对应ID的商品确实在购物车内,防止给不存在的商品追加附加项
- 补充去重逻辑:默认判断附加项ID已存在时不重复存入,如果业务允许同一个附加项重复添加,直接删掉
in_array相关判断即可 - 如果后续要做「取消勾选就删除对应附加项」的功能,逻辑完全一致:取出完整购物车数组,定位到对应商品的
addons数组,找到目标addon_id的下标删除后,再把整个cart存回session即可
内容的提问来源于stack exchange,提问作者jasdev
相关产品推荐
相关产品推荐

