Laravel同分类商品展示报错:Undefined property: LengthAwarePaginator::$cat_id
问题分析与解决方案
嘿,我一眼就看出问题所在啦!你用Paginate(1)获取单个商品的时候,得到的不是单个商品模型实例,而是一个LengthAwarePaginator分页对象——哪怕只分页1条数据,它本质还是个集合容器,所以直接访问$product->cat_id肯定会报未定义属性的错。
修正后的控制器代码
public function product($id){ // 使用first()获取单个商品模型,替代Paginate(1) $product = Products::where('pro_id',$id)->first(); // 新增判断:如果商品不存在,直接返回404页面 if(!$product) { abort(404); } // 获取同分类的相关商品,同时排除当前商品本身 $products = Products::where('cat_id', $product->cat_id) ->where('pro_id', '!=', $id) ->get(); return view('front.product.product', compact('product','products')); }
关键说明
- 替换
Paginate(1)为first():first()会直接返回匹配的第一个商品模型实例,而非分页对象,这样就能正常访问$product->cat_id属性了。 - 排除当前商品:新增
where('pro_id', '!=', $id)可以避免在相关商品列表里显示当前正在查看的商品,更符合用户体验。 - 商品不存在判断:防止因传入无效
id导致$product为null,进而引发后续代码报错。
视图调整提示
原来你在视图里用@foreach遍历$product是不合理的,现在$product是单个商品模型,直接通过$product->pro_name、$product->price这样的方式访问属性即可;而同分类商品集合$products才需要用@foreach遍历:
{{-- 展示当前商品详情 --}} <h1>{{ $product->pro_name }}</h1> <p>{{ $product->description }}</p> {{-- 展示同分类相关商品 --}} <h3>相关商品</h3> @foreach($products as $relatedProduct) <div class="related-item"> <a href="{{ route('product', $relatedProduct->pro_id) }}">{{ $relatedProduct->pro_name }}</a> </div> @endforeach
内容的提问来源于stack exchange,提问作者Zerontelli
相关产品推荐
相关产品推荐

