You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:34:11