You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 13:36:03