Sequelize 中的 belongsToMany 关系详解

阅读时长 5 分钟读完

在使用 Sequelize ORM(Object-Relational Mapping)时,我们可能会遇到多对多的关系。这时,我们就需要使用 belongsToMany 这个关系类型。在本文中,我们将详细讲解在 Sequelize 中如何使用 belongsToMany

什么是 belongsToMany 关系?

在 Sequelize 中,我们可以通过将两个模型之间的关联关系定义为 belongsToMany 类型来表示多对多的关系。这种关系类型需要至少两个模型之间的连接表(junction table)来维护两个模型之间的关系。

一个典型的多对多关系:一篇文章有多个标签,而一个标签也可以与多篇文章关联。在这种情况下,我们可以定义两个模型:ArticleTag。连接表将包括 article_idtag_id 字段,用于维护 ArticleTag 之间的关系。

如何在 Sequelize 中使用 belongsToMany?

让我们先定义一个简单的例子。我们有两个模型:TeacherStudent。一个老师可以教授多个学生,而一个学生也可以由多个老师来教授。为了建立他们之间的多对多关系,我们需要创建一个连接表 teaching

我们定义模型:

-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - --- --------------------- ----------- ----------- -
  -------- ---------
  -------- -----------------
---

----- ------- - --------------------------- -
  --- -
    ----- ------------------
    ----------- ----
  --
  ----- ----------------
---

----- ------- - --------------------------- -
  --- -
    ----- ------------------
    ----------- ----
  --
  ----- ----------------
---

----- -------- - ---------------------------- ----

------------------------------ - -------- -------- ---
------------------------------ - -------- -------- ---

在这里,我们使用 belongsToMany 方法来定义 TeacherStudent 之间的多对多关系。通过设置 through 选项,我们告诉 Sequelize 使用我们创建的 teaching 表作为连接表。

如何查询 belongsToMany 关系?

当我们使用 Sequelize 查询 Teacher 模型时,我们需要使用 include 选项,将关联的 Student 模型引入查询中:

这个查询将查找所有的老师,并将他们关联的学生作为 students 属性返回。我们也可以按条件查询:

-- -------------------- ---- -------
-----------------
  -------- --
    ------ --------
    ------ - --- - --
    -------- --------
  --
---------------- -- -
  ---------------------
--

这个查询将查找所有教授学生 id 为 1 的老师,将他们关联的学生作为 students 属性返回。

如何添加/删除 belongsToMany 关系?

在创建了多对多关系之后,我们就可以通过创建/更新关联数据来添加/更新连接表中的行。下面是如何将教师 1 分配给学生 2:

在这里,我们使用 addStudent 方法将学生 2 分配给了老师 1。我们也可以通过 removeStudent 方法来删除分配的关系:

总结

多对多关系是 Sequelize 中的常见关系类型。通过使用 belongsToMany 方法来定义该类型的关系,我们可以轻松地建立模型之间的多对多关系,并使用连接表来维护这些关系。在查询多对多关系时,使用 include 属性来引入关联模型。添加/删除连接表中的数据可以通过 add/remove 方法完成。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f29af9f6b2d6eab3c3b409

纠错
反馈