You need to enable JavaScript to run this app. Eloquent ORM多对多关联中如何获取第三张表的数据
优惠活动
大模型
产品
解决方案
定价
更多

Eloquent ORM多对多关联中如何获取第三张表的数据

Eloquent穿透多层关联获取第三张表数据的实现

当前关联链路说明

你目前已经搭建的关联链路为 Book -> BookCategory -> Category,其中BookCategory是两张主表的中间关联表,不需要修改现有已定义的关联方法,就可以通过Eloquent原生能力拿到Category表的全部数据。

方法1:嵌套预加载(零改动兼容现有代码)

直接利用Eloquent的嵌套预加载语法,一次查询就把两层关联的数据全部加载完成,不需要手写JOIN语句。

  • 调用查询时的写法:
// with()内用点号拼接关联层级,依次加载bookCategories、bookCategories下的category
$bookList = Book::with('bookCategories.category')->get();
  • 数据访问逻辑:
    沿着关联层级逐层取值即可:
foreach ($bookList as $book) {
    // 遍历当前书籍关联的中间表记录
    foreach ($book->bookCategories as $bookCategory) {
        // 此处可直接读取Category表的name、type字段
        $categoryInfo = $bookCategory->category;
    }
}

性能提示:预加载时必须把关联层级写全,只加载bookCategories而不嵌套加载category的话,后续读取分类数据时会触发多次额外查询,出现N+1性能问题。

方法2:定义跨层直通关联(简化访问逻辑)

由于Book和Category本质是多对多的业务关系,BookCategory仅承担中间表的作用,可以直接在Book模型上定义直通Category的多对多关联,绕开对BookCategory层的感知,代码更简洁。

  1. 在Book模型中新增关联方法:
public function categories()
{
    // 参数依次为:关联模型类、中间表名、Book侧外键、Category侧外键
    return $this->belongsToMany(Category::class, 'book_categories', 'book_id', 'category_id');
}
  1. 查询时仅需一层预加载即可拿到所有分类数据:
$bookList = Book::with('categories')->get();
  1. 数据访问时不需要遍历中间表记录,直接读取Book对象下的categories集合即可,逻辑层级更浅。

内容的提问来源于stack exchange,提问作者Asfos22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.15 14:24:03