Laravel 8.*将数据库关联表数据传递到视图时报null属性错误如何解决
问题原因
- 仓库层查询逻辑错误
你的FrontendRepository的getObject方法写了两次return,执行完第一行return EventObject::find($id)就直接返回结果了,下方带关联加载的代码永远不会执行,所以模型中根本没有加载clubs关联数据。而且第二行查询写法也不符合需求,get()是返回多条记录的集合,你要查单个ID的关联数据应该用find搭配with。 - 关联空值未做兼容处理
部分events表的记录可能没有对应的关联club数据(外键值为空、外键指向的club记录已删除),直接访问$object->clubs->name就会触发null对象读取属性的报错。
修复步骤
1. 修正仓库层查询代码
把FrontendRepository的getObject方法替换为以下代码:
public function getObject($id) { // 加载关联查询单个ID的记录 return EventObject::with(['clubs'])->find($id); }
2. (可选)规范关联命名
因为clubs是belongsTo单关联,建议把关联方法名改为单数形式club更符合Laravel命名规范,避免混淆,修改EventObject模型代码:
public function club() { return $this->belongsTo('App\Models\Club'); }
修改后查询关联的写法也要对应改成with(['club'])。
3. 视图层兼容空值
修改object.blade.php里的club名称输出代码,用Laravel提供的optional辅助函数或者null合并运算符兼容空关联的情况:
写法1(使用optional,推荐)
<h3 class="text-center">{{ optional($object->clubs)->name }} club name</h3> <!-- 如果你修改了关联名为club,就改成 --> <h3 class="text-center">{{ optional($object->club)->name }} club name</h3>
写法2(使用null合并运算符)
<h3 class="text-center">{{ $object->clubs->name ?? '暂无关联俱乐部' }} club name</h3>
内容的提问来源于stack exchange,提问作者MichalGrab
相关产品推荐
相关产品推荐

