Laravel 5.6报错:Trying to get property 'nsc' of non-object 求助
排查 "Trying to get property 'nsc' of non-object" 错误的方案
这个错误本质是你尝试访问一个非对象的属性——也就是说当你调用 $item->GroupClass->nsc 时,$item->GroupClass 返回的是 null,而非预期的GroupClass模型实例。下面一步步帮你排查和解决:
一、先确认关联关系的定义是否正确
在Laravel的belongsTo关联中,参数顺序是:belongsTo(关联模型类名, 当前模型的外键字段, 关联模型的主键字段)
看你的ItemName模型代码:
public function GroupClass() { return $this->belongsTo('App\GroupClass', 'nsc', 'inc'); }
这里要确认两个核心点:
- ItemName表(
tbl_item_name)中确实存在nsc字段,用来存储GroupClass表的关联ID - GroupClass表的主键是
inc(而非Laravel默认的id),并且GroupClass模型中必须明确声明主键:// GroupClass模型中需要添加这行(如果主键不是id的话) protected $primaryKey = 'inc';
如果GroupClass的主键是默认的id,那你的关联定义就错了,应该改成:
public function GroupClass() { return $this->belongsTo('App\GroupClass', 'nsc'); // 第三个参数默认是'id',可省略 }
二、检查数据库数据是否存在关联缺失
有些ItemName记录的nsc字段可能是null,或者这个值在GroupClass表的inc字段中找不到对应记录,这时候$item->GroupClass就会返回null。
你可以用SQL查询快速验证:
SELECT * FROM tbl_item_name WHERE nsc NOT IN (SELECT inc FROM tbl_group_class) OR nsc IS NULL;
如果查询到结果,说明这些记录没有对应的GroupClass,访问它们的GroupClass->nsc就会触发错误。
三、在代码中处理关联为null的情况
即使数据没问题,也应该做防御性处理避免报错,有几种实用方式:
方式1:使用可选链操作符(PHP 7.4+支持)
// 如果GroupClass是null,会返回null而不是报错 $nscValue = $item->GroupClass?->nsc;
方式2:使用optional()辅助函数(兼容低版本PHP)
$nscValue = optional($item->GroupClass)->nsc;
方式3:提前判断关联是否存在
if ($item->GroupClass) { $nscValue = $item->GroupClass->nsc; } else { // 处理关联不存在的情况,比如设置默认值 $nscValue = '无关联分类'; }
四、额外优化:用预加载避免N+1问题
如果你是循环遍历多个ItemName实例并访问GroupClass关联,记得用预加载,既提升性能也能避免潜在的关联加载异常:
$items = ItemName::with('GroupClass')->get(); foreach ($items as $item) { $nscValue = optional($item->GroupClass)->nsc; // ...其他业务逻辑 }
内容的提问来源于stack exchange,提问作者Dewa Aditya
相关产品推荐
相关产品推荐

