在使用 Sequelize ORM(Object-Relational Mapping)时,我们可能会遇到多对多的关系。这时,我们就需要使用 belongsToMany
这个关系类型。在本文中,我们将详细讲解在 Sequelize 中如何使用 belongsToMany
。
什么是 belongsToMany 关系?
在 Sequelize 中,我们可以通过将两个模型之间的关联关系定义为 belongsToMany
类型来表示多对多的关系。这种关系类型需要至少两个模型之间的连接表(junction table)来维护两个模型之间的关系。
一个典型的多对多关系:一篇文章有多个标签,而一个标签也可以与多篇文章关联。在这种情况下,我们可以定义两个模型:Article
和 Tag
。连接表将包括 article_id
和 tag_id
字段,用于维护 Article
和 Tag
之间的关系。
如何在 Sequelize 中使用 belongsToMany?
让我们先定义一个简单的例子。我们有两个模型:Teacher
和 Student
。一个老师可以教授多个学生,而一个学生也可以由多个老师来教授。为了建立他们之间的多对多关系,我们需要创建一个连接表 teaching
。
我们定义模型:
-- -------------------- ---- ------- ----- --------- - --------------------- ----- --------- - --- --------------------- ----------- ----------- - -------- --------- -------- ----------------- --- ----- ------- - --------------------------- - --- - ----- ------------------ ----------- ---- -- ----- ---------------- --- ----- ------- - --------------------------- - --- - ----- ------------------ ----------- ---- -- ----- ---------------- --- ----- -------- - ---------------------------- ---- ------------------------------ - -------- -------- --- ------------------------------ - -------- -------- ---
在这里,我们使用 belongsToMany
方法来定义 Teacher
和 Student
之间的多对多关系。通过设置 through
选项,我们告诉 Sequelize 使用我们创建的 teaching
表作为连接表。
如何查询 belongsToMany 关系?
当我们使用 Sequelize 查询 Teacher
模型时,我们需要使用 include
选项,将关联的 Student
模型引入查询中:
Teacher.findAll({ include: [{ model: Student, through: Teaching }] }).then(teachers => { console.log(teachers) })
这个查询将查找所有的老师,并将他们关联的学生作为 students
属性返回。我们也可以按条件查询:
-- -------------------- ---- ------- ----------------- -------- -- ------ -------- ------ - --- - -- -------- -------- -- ---------------- -- - --------------------- --
这个查询将查找所有教授学生 id 为 1 的老师,将他们关联的学生作为 students
属性返回。
如何添加/删除 belongsToMany 关系?
在创建了多对多关系之后,我们就可以通过创建/更新关联数据来添加/更新连接表中的行。下面是如何将教师 1 分配给学生 2:
Teacher.findById(1).then(teacher => { Student.findById(2).then(student => { teacher.addStudent(student); }); });
在这里,我们使用 addStudent
方法将学生 2 分配给了老师 1。我们也可以通过 removeStudent
方法来删除分配的关系:
Teacher.findById(1).then(teacher => { Student.findById(2).then(student => { teacher.removeStudent(student); }); });
总结
多对多关系是 Sequelize 中的常见关系类型。通过使用 belongsToMany
方法来定义该类型的关系,我们可以轻松地建立模型之间的多对多关系,并使用连接表来维护这些关系。在查询多对多关系时,使用 include
属性来引入关联模型。添加/删除连接表中的数据可以通过 add
/remove
方法完成。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f29af9f6b2d6eab3c3b409