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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:52:54