Sequelize 是一个 Node.js 的 ORM(对象关系映射) 库,它使得在 Node.js 应用中对数据库进行操作更加方便。Sequelize 支持多种类型的数据库,并且具有强大的查询与事务操作功能,而且它能够把数据库操作转化为简单的 Javascript 对象操作。
在本篇文章中,我们将介绍 Sequelize ORM 中如何进行多于两个表的关联操作。这个问题在实际应用中非常常见,比如我们需要获取一篇文章的信息,同时还需要获取该文章的作者、作者的头像、评论等等。
要解决这个问题,Sequelize 提供了三种方式:belongsToMany、hasManyThrough 和 hasManyAndBelongsToMany。
belongsToMany
belongsToMany 用于连接两个具有多对多关系的模型,例如文章和标签,一个文章可以有多个标签,一个标签也可以被多篇文章使用。我们首先需要定义两个模型,然后再通过一个第三张表将它们连接起来。接下来,我们通过一个例子来讲解如何进行多表关联操作:
// javascriptcn.com 代码示例 const Article = sequelize.define('article', { title: Sequelize.STRING, }); const Tag = sequelize.define('tag', { name: Sequelize.STRING, }); const ArticleTag = sequelize.define('article_tag', {}); Article.belongsToMany(Tag, { through: ArticleTag }); Tag.belongsToMany(Article, { through: ArticleTag }); // 查询文章及其标签 Article.findOne({ where: { id: 1 }, include: Tag, }).then((article) => { console.log(article.get({ plain: true })); });
如上所示,我们首先定义了一个 Article 模型和一个 Tag 模型,然后通过一个 ArticleTag 模型将它们连接起来。接着,我们使用 belongsToMany 方法进行多表关联操作,并通过 through 属性指定中间表。最后,在查询时,我们使用 include 属性将 Tag 模型包括进来。
hasManyThrough
hasManyThrough 用于连接三个具有一对多关系的模型,例如学生、班级和学校,一个学校可以有多个班级,一个班级可以有多个学生。我们需要定义三个模型,然后在两个一对多关系中加入了一个中介关系。接下来我们通过一个例子来演示如何使用 hasManyThrough 方法:
// javascriptcn.com 代码示例 const School = sequelize.define('school', { name: Sequelize.STRING, }); const Clazz = sequelize.define('clazz', { name: Sequelize.STRING, }); const Student = sequelize.define('student', { name: Sequelize.STRING, }); School.hasMany(Clazz); Clazz.belongsTo(School); Clazz.hasMany(Student); Student.belongsTo(Clazz); School.belongsToMany(Student, { through: Clazz }); Student.belongsToMany(School, { through: Clazz }); // 查询学校及其学生 School.findOne({ where: { id: 1 }, include: Student, }).then((school) => { console.log(school.get({ plain: true })); });
如上所示,我们首先定义了一个 School 模型、一个 Clazz 模型和一个 Student 模型。然后,在二者一对多关系中,我们加入了一个中介关系 Clazz。接着,我们使用 belongsToMany 方法进行多表关联操作,并通过 through 属性指定中间表。最后,在查询时,我们使用 include 属性将 Student 模型包括进来。
hasManyAndBelongsToMany
hasManyAndBelongsToMany 也是用于连接多个具有一对多关系的模型,和 hasManyThrough 方法类似,只是中介关系变成了两个。我们需要定义三个模型,然后在两个一对多关系中加入两个中介关系。接下来我们通过一个例子来演示如何使用 hasManyAndBelongsToMany 方法:
// javascriptcn.com 代码示例 const Reader = sequelize.define('reader', {}); const Book = sequelize.define('book', {}); const Author = sequelize.define('author', {}); const Genre = sequelize.define('genre', {}); const Book_Genre = sequelize.define('book_genre', {}); const Book_Author = sequelize.define('book_author', {}); Author.belongsToMany(Book, { through: Book_Author }); Book.belongsToMany(Author, { through: Book_Author }); Book.belongsToMany(Genre, { through: Book_Genre }); Genre.belongsToMany(Book, { through: Book_Genre }); // 查询一本书及其作者、类型和读者 Book.findOne({ where: { id: 1 }, include: [ { model: Author }, { model: Genre }, { model: Reader }, ], }).then((book) => { console.log(book.get({ plain: true })); });
如上所示,我们首先定义了 Reader、Book、Author 和 Genre 四个模型,并通过 Book_Genre 和 Book_Author 模型将它们连接起来。然后,我们通过 belongsToMany 方法进行多表关联操作,并通过 through 属性指定中间表。最后,在查询时,我们使用 include 属性包含三个模型。
总结
本文介绍了 Sequelize ORM 中如何进行多于两个表的关联操作,包括 belongsToMany、hasManyThrough 和 hasManyAndBelongsToMany 方法。在实际应用中,多表关联操作为我们提供了极大的便利,让我们能够轻松地完成复杂的数据处理操作。同时,了解这些方法也有助于我们更好地理解 Sequelize ORM 的工作原理。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6528e7087d4982a6ebb74360