调用$note->category->name报trying to get property of non-object错误如何解决

执行dd()时可得到Note Category类型的对象,但运行如下代码时报错:$note->category->name
错误类型为trying to get property of non-object,对应报错截图如下:
问题原因与解决方法
- 核心逻辑:dd()会在打印后直接终止程序运行,你看到的是终止前的正常状态,实际运行全量代码时,要么某一条
$note实例没有关联有效的category数据,要么后续逻辑修改了$note->category的值为非对象类型。
快速修复
PHP 7.4及以上版本可以直接使用null安全运算符,关联不存在时直接返回null不报错:
$note->category?->name
低版本PHP可以使用Laravel的optional辅助函数实现相同效果:
optional($note->category)->name
根因排查
- 检查数据库中对应
note记录的category_id是否有效,是否存在关联到category表的合法记录,如果允许note没有分类,建议给category_id字段设置为允许为null,同时关联查询用withDefault设置默认模型:
// 在Note模型的category关联中添加withDefault public function category() { return $this->belongsTo(Category::class)->withDefault([ 'name' => '未分类' ]); }
- 排查dd()之后的代码,是否存在修改
$note->category属性的逻辑,比如unset操作、重新赋值为数组/字符串等操作。 - 如果是在遍历多个note实例时出现报错,可以用如下代码定位出现问题的单条记录:
foreach ($notes as $note) { if (!is_object($note->category)) { dd('异常记录ID:' . $note->id, '关联的分类ID:' . $note->category_id); } }
内容的提问来源于stack exchange,提问作者Erfan Ahmed Siam
相关产品推荐
相关产品推荐

