在Laravel中获取商品数据时出现trying to get property 'id' of non-object错误
错误产生原因
- 核心原因是
Brands::where('url',$brand_url)->first()执行后返回了null:当数据库中不存在url字段值等于传入参数$brand_url的品牌记录时,first()方法会返回空值而非 Brands 模型对象,此时访问空值的id属性就会触发trying to get property 'id' of non-object错误。
解决方法
- 方法1:使用
firstOrFail()替代first()
Laravel 提供的firstOrFail()方法会在查询不到匹配记录时自动抛出404异常,无需手动判断,修改对应行代码即可:
$brands = Brands::where('url',$brand_url)->firstOrFail();
- 方法2:手动判断查询结果是否存在
如果需要自定义查询不到品牌时的处理逻辑(比如跳转回列表页加提示),可以手动加存在性校验,同时可以优化冗余的商品查询条件:
public function brandsview($cate_url, $brand_url) { $brands = Brands::where('url',$brand_url)->first(); // 校验品牌是否存在 if (is_null($brands)) { // 示例:返回404,也可替换为跳转逻辑 abort(404, '请求的品牌不存在'); } $products = Products::where('brand_id', $brands->id) // 原有两个status判断逻辑重复,保留等于Show的判断即可 ->where('status', 'Show') ->get(); return view('lokalproductspage.brands') ->with('brands', $brands) ->with('products', $products); }
- 额外排查项
如果确认数据库中存在对应品牌,可检查传入的$brand_url参数是否正确:确认路由参数拼写是否和预期一致,数据库中brands表url字段的存储值是否和传入参数完全匹配(注意大小写、前后空格、特殊字符转义问题)。
可选优化建议
变量名 $brands 语义上是多个品牌,但实际存储的是单个品牌模型,建议修改为 $brand 提升代码可读性。
内容的提问来源于stack exchange,提问作者Lauren James Borja
相关产品推荐
相关产品推荐

