Laravel查询商品表仅返回1条数据,如何获取购物车所有关联商品?
问题修复方案
问题原因
- 错误使用
where方法查询多ID:where('id',$cartData)会将拼接后的逗号分隔字符串作为单个ID值匹配,数据库执行时等价于id = "1,1,3",如果数据库做隐式类型转换只会匹配到ID为1的商品,因此仅返回一条结果。 - 视图传参格式错误:
view()方法第二个参数为所有视图变量的集合,拆分两个数组传参的写法会导致第二个数组里的$cartData无法传递到视图中。
修复代码
控制器index方法(基础去重版,相同ID商品仅展示一次)
public function index() { session_start(); // 直接读取购物车ID数组,无需拼接为字符串 $cartIds = $_SESSION['cart'] ?? []; // 使用whereIn方法匹配多个ID $cartProducts = Product::whereIn('id', $cartIds)->get(); // 合并视图参数到同一个数组 return view('basket', [ 'cartProducts' => $cartProducts, 'cartData' => implode(',', $cartIds) ]); }
控制器index方法(保留重复商品版,相同ID商品按购物车数量展示多次)
如果购物车中同一个商品添加多次需要展示多条,whereIn默认会去重,需要额外组装数据:
public function index() { session_start(); $cartIds = $_SESSION['cart'] ?? []; // 查询所有唯一ID对应的商品,并用ID作为集合的键 $uniqueProducts = Product::whereIn('id', array_unique($cartIds))->get()->keyBy('id'); // 按照购物车的ID顺序组装商品列表,保留重复项 $cartProducts = collect(); foreach ($cartIds as $id) { if (isset($uniqueProducts[$id])) { $cartProducts->push($uniqueProducts[$id]); } } return view('basket', [ 'cartProducts' => $cartProducts, 'cartData' => implode(',', $cartIds) ]); }
前端代码
原有的遍历代码无需修改即可正常输出所有匹配的商品:
@foreach($cartProducts as $cartProduct) <p>{{$cartProduct->name}}</p> <p>{{$cartProduct->size}}</p> <p>{{$cartProduct->price}}</p> @endforeach
内容的提问来源于stack exchange,提问作者SVJ99
相关产品推荐
相关产品推荐

