Laravel 8 出现Attempt to read property "id" on null错误的排查求助
解决 "Attempt to read property 'id' on null" 错误
这个报错的根源很清晰:你有至少一条Meal数据没有关联对应的Category,当资源类里直接调用$this->category->id时,因为$this->category是null,自然就触发了这个错误。下面分步骤帮你排查修复:
1. 先修正 Meals 和 Category 的关联逻辑
从常规业务逻辑来看,一个分类对应多个菜品,一个菜品属于一个分类,你当前的关联定义搞反了:
- 你在
Meals模型里用了hasOne(Category::class, 'meals_id'),这表示「一个菜品拥有一个分类」,意味着categories表要存meals_id外键,这不符合绝大多数场景的设计。 - 正确的关联应该是
Meals属于Category,用belongsTo来定义:
修改Meals模型的category方法:
public function category() { // 假设你的meals表中有category_id外键,关联categories表的id字段 return $this->belongsTo(Category::class, 'category_id'); // 如果你的外键不是默认的category_id,替换成实际字段名即可 }
如果你的业务逻辑确实是「一个菜品对应唯一分类(categories表存meals_id)」,那你需要确保所有Meal数据都有对应的Category记录,但这种设计非常少见,优先推荐按常规的「菜品从属分类」调整。
2. 给关联加兜底处理(避免空指针)
就算关联逻辑正确,也可能存在部分Meal未绑定分类的情况,这时候要在资源类里做空值判断:
修改Meals资源类的category字段:
"category" => $this->category ? [ "id" => $this->category->id, "title" => $this->category->title, "slug" => $this->category->slug, ] : null, // 也可以返回空数组[],根据你的接口规范来定
或者用PHP 8+的空安全运算符简化写法:
"category" => [ "id" => $this->category?->id, "title" => $this->category?->title, "slug" => $this->category?->slug, ],
这样当$this->category为null时,对应的字段会返回null,而不会抛出错误。
3. 额外检查点
- 确认你的seed数据里,所有Meal都正确关联了Category(如果业务要求必须绑定分类的话);
- 你的控制器里已经用
with('category', 'tags', 'ingredients')预加载关联,这部分是正确的,能避免N+1查询问题,保持即可。
内容的提问来源于stack exchange,提问作者Zlatnii
相关产品推荐
相关产品推荐

