Laravel 5.7视图报错Trying to get property 'firstname' of non-object求助
排查Laravel 5.7中“Trying to get property 'firstname' of non-object”错误
嘿,我来帮你梳理下这个问题的排查思路!首先看你视图里的代码,第一个明显的问题就藏在这里:
你写的是:
{{ $asset->employee->firstname }} {{ $asset->$employee->lastname }}
注意第二个字段里多了个多余的$符号!应该改成:
{{ $asset->employee->firstname }} {{ $asset->employee->lastname }}
这是最容易修正的语法错误,但除了这个,还有几个常见原因会导致这个报错,咱们一步步来排查:
1. 检查关联定义是否正确
先确认你的模型关联有没有配置对:
- Asset模型的
belongsTo关联:
确保代码是这样的(如果你的外键不是默认的employee_id,要手动指定第二个参数):public function employee() { return $this->belongsTo(\App\Employee::class); // 如果外键是自定义的,比如assigned_employee_id,就改成: // return $this->belongsTo(\App\Employee::class, 'assigned_employee_id'); } - Employee模型的
hasMany关联:
同样确认代码:public function assets() { return $this->hasMany(\App\Asset::class); // 对应自定义外键的话,也要加上: // return $this->hasMany(\App\Asset::class, 'assigned_employee_id'); }
2. 检查数据库数据是否有效
去数据库里查看对应的assets表记录,确认employee_id字段:
- 该字段是不是有值?如果是
NULL,那$asset->employee自然就是null,访问firstname肯定会报错。 - 这个
employee_id的值在employees表中有没有对应的记录?如果ID不存在,Laravel也会返回null。
3. 确保关联数据被正确加载
在控制器查询Asset的时候,记得用预加载来获取关联的员工数据,避免懒加载可能带来的问题:
// 控制器里的查询代码 $asset = \App\Asset::with('employee')->find($id); // 或者用where条件查询 $asset = \App\Asset::with('employee')->where('id', $id)->first(); return view('assets.asset', compact('asset'));
如果没有用with('employee'),Laravel会尝试懒加载,但如果关联数据不存在,还是会返回null。
4. 给视图添加容错处理
为了避免后续因为数据问题再次报错,可以在视图里做容错处理,比如用??运算符或者optional辅助函数:
// 方式1:使用null合并运算符 {{ $asset->employee->firstname ?? '' }} {{ $asset->employee->lastname ?? '' }} // 方式2:使用optional辅助函数 {{ optional($asset->employee)->firstname }} {{ optional($asset->employee)->lastname }}
这样即使$asset->employee是null,页面也不会报错,只会显示空字符串。
内容的提问来源于stack exchange,提问作者boldsinas101
相关产品推荐
相关产品推荐

