Laravel中访问Eloquent对象属性报'Trying to get property of non-object'错误求助
问题分析与解决方案
咱们一步步拆解你遇到的两个问题,搞清楚根源:
1. 直接访问$rad->category->category_name报错的核心原因
虽然你用了with('category')预加载关联,而且部分Ad的category关联能正常输出对象,但循环里大概率存在某个Ad的category_id是无效值(比如null、或者categories表里不存在的ID),这时候$rad->category会是null,你直接访问null->category_name自然就触发了Trying to get property of non-object错误。
你可以在循环里加个判断验证这个猜想:
foreach($ad as $rad){ // 先判断分类关联是否存在 if($rad->category){ var_dump($rad->category->category_name); } else { echo "当前广告未关联有效分类<br>"; } }
如果确实存在无分类的广告,你可以根据业务需求处理:
- 要么在查询时直接过滤掉无有效分类的广告:
$ad = Ad::activeRegular() ->with('category', 'city') // 只保留有有效分类关联的广告 ->has('category') ->limit($limit_regular_ads) ->orderBy('id', 'desc') ->get();
- 要么在视图里做容错处理,避免直接访问null的属性。
2. 为什么$rad->category()->category_name也报错?
这是Laravel关联的基础概念混淆了:
$rad->category:这是属性访问,会触发预加载(或延迟加载),返回的是关联的Category模型对象(或null)。$rad->category():这是调用关联方法,返回的是BelongsTo关联查询构造器实例,不是模型对象,自然没法直接访问category_name属性。
如果非要用方法调用的方式获取属性,得先拿到模型对象(但完全没必要,因为你已经预加载了):
// 不推荐,会重复查询数据库 $rad->category()->first()->category_name;
内容的提问来源于stack exchange,提问作者Ramesh Pareek
相关产品推荐
相关产品推荐

