Laravel 8 Eloquent查询无评论时报Attempt to read property "id" on null
报错根源
报错核心是PostComments模型中与用户的关联关系定义错误:
- 单条评论仅对应1个发布用户,属于从属关联,应当使用
belongsTo定义,你当前误用了hasMany一对多关联 hasMany返回的是用户模型集合而非单个用户实例,当关联用户不存在、或者关联关系解析异常时,后续逻辑调用$comment->user->id就会触发「Attempt to read property "id" on null」错误,哪怕文章没有评论本身不会触发这个报错,报错本质是关联关系定义错误导致的属性读取异常。
修复方案
- 修正评论模型的user关联定义
将原有错误的关联代码:
public function user(){ return $this->hasMany(User::class,'id','user_id')->latest(); }
替换为正确的从属关联:
public function user(){ // 关联逻辑:当前评论表的user_id字段,对应用户表的id字段 return $this->belongsTo(User::class, 'user_id', 'id'); }
注意:单条模型关联不需要加
->latest()排序方法,该方法仅对集合结果生效,写在单关联定义中会引发额外的查询逻辑异常。
- 极端场景兼容(可选)
如果存在用户账号被删除、评论残留脏数据(user_id对应不存在的用户)的场景,可以在输出评论用户信息时用空安全操作符做兜底,避免再次触发同类报错:
// 模板输出示例 {{ $comment->user?->username ?? '匿名用户' }}
修正关联后,你原有写的评论查询逻辑不需要改动即可正常运行:
$comments=PostComments::with('user:id,username') ->where('post_id',$this->id)->latest()->get();
内容的提问来源于stack exchange,提问作者Nurideen Yahuza
相关产品推荐
相关产品推荐

