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及以上版本可以直接用空安全运算符简化写法:
低版本PHP就用条件判断兜底:<td> {{ $new->category?->name ?? '未分类' }}</td><td> @if($new->category) {{ $new->category->name }} @else 未分类 @endif </td>
内容的提问来源于stack exchange,提问作者Emre Ensar Çapcı
相关产品推荐
相关产品推荐

