You need to enable JavaScript to run this app. Laravel Blade输出新闻分类时报Attempt to read property "name" on null错误
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade输出新闻分类时报Attempt to read property "name" on null错误

报错根因排查

这个Attempt to read property "name" on null报错,本质是你遍历拿到的某条新闻记录,关联的分类对象本身是null,直接读null的name属性自然触发错误。对照你给的代码逐行排查,有两个绕不开的问题:

核心隐蔽bug:关联方法外键映射错配

Laravel的belongsTo关联有一套默认匹配逻辑:不手动传参数的话,会根据关联方法的蛇形命名,去当前模型对应的数据表里找同名字段当外键。
你在News模型里写的关联方法叫category,按规则Laravel会自动去news表里找category_id字段,去关联categories表的主键。但你实际的news表里存分类ID的字段叫cat_id,根本不是category_id——等于关联逻辑从根上就找错了字段,就算你在控制器里写了with('category')预加载,也永远匹配不到对应的分类记录,返回的关联值永远是null。

你现在的关联方法缺参数,正确写法是手动指定外键映射关系:

public function category(){
    // 依次传入:关联模型类、当前模型的外键字段、关联模型的主键字段
    return $this->belongsTo(Category::class, 'cat_id', 'id');
}

可以对照下你写的author()关联:因为你的表字段刚好叫author_id,和Laravel的默认规则完全匹配,所以这个关联是正常生效的,不会返回null。

模板端缺空值兜底

就算把上面的关联映射修对了,也难免有历史脏数据:比如早期数据库没开外键约束的时候删过分类,导致news表里残留了无效的cat_id值,这时候对应的分类关联依然会返回null,如果模板里直接硬写$new->category->name,还是会触发同样的报错。

落地解决步骤
  • 先把News模型里的category()关联方法按上面的写法补全参数,在控制器里可以临时用dd(News::with('category')->first())验证下,确认返回的category关联能拿到具体的Category模型对象。
  • 排查数据库脏数据:把news表里所有cat_id列的值,和categories表的id列做比对,找出那些cat_id在分类表里找不到匹配项的记录,要么把cat_id修正为有效的分类ID,要么直接删掉无效的历史数据。
  • 修改Blade模板的分类输出逻辑,加空值兼容:
    PHP8及以上版本可以直接用空安全运算符简化写法:
    <td> {{ $new->category?->name ?? '未分类' }}</td>
    
    低版本PHP就用条件判断兜底:
    <td>
        @if($new->category)
            {{ $new->category->name }}
        @else
            未分类
        @endif
    </td>
    

内容的提问来源于stack exchange,提问作者Emre Ensar Çapcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 13:15:03