Sequelize 是一款优秀的 Node.js ORM 框架,它支持多种数据库,并提供了丰富的 API,可以轻松地进行数据库操作。其中 include 操作是 Sequelize 权威文档中提到的一个比较常用的 API,本文将详细介绍如何使用 include 操作进行关联查询。
了解 Sequelize 中的关系模型
在学习 include 操作之前,需要了解 Sequelize 中的关系模型。Sequelize 中的数据模型主要有四种关系:
- 一对一(One-to-One):指两个实体之间的关系,其中一个实体只有一个关联实体,
- 一对多(One-to-Many):指两个实体之间的关系,其中一个实体可以拥有多个关联实体,
- 多对一(Many-to-One):指两个实体之间的关系,其中一个关联实体可以被多个实体拥有,
- 多对多(Many-to-Many):指两个实体之间的关系,其中每个实体都可以拥有多个关联实体。
在 Sequelize 中,需要使用 belongsTo 和 hasMany 方法来描述两个实体的关系。
belongsTo 方法表示一对一或多对一的关系,用来表示被关联实体属于一个实体,语法如下:
const User = sequelize.define('user', { // ... }) const BlogPost = sequelize.define('blogPost', { // ... }) BlogPost.belongsTo(User)
hasMany 方法表示一对多或多对多的关系,用来表示一个实体拥有多个被关联实体,语法如下:
const User = sequelize.define('user', { // ... }) const BlogPost = sequelize.define('blogPost', { // ... }) User.hasMany(BlogPost)
使用 include 操作进行关联查询
当需要查询一个实体及其关联实体时,可以使用 include 操作,该操作支持传递多个参数,以便查询多级关联实体。include 操作的语法如下:
Model.findAll({ include: [ { model: RelatedModel } ] })
其中 Model 表示当前实体,RelatedModel 表示关联实体。
下面通过一个例子来说明如何使用 include 操作进行关联查询:
const { Sequelize, Model, DataTypes } = require('sequelize') const sequelize = new Sequelize('sqlite::memory:') class User extends Model {} User.init({ name: DataTypes.STRING }, { sequelize }) class BlogPost extends Model {} BlogPost.init({ title: DataTypes.STRING }, { sequelize }) User.hasMany(BlogPost) BlogPost.belongsTo(User) async function main () { await sequelize.sync({ force: true }) // 创建测试数据 const user = await User.create({ name: 'Tom' }) await BlogPost.create({ title: 'Post One', userId: user.id }) await BlogPost.create({ title: 'Post Two', userId: user.id }) // 查询用户及其博客文章 const users = await User.findAll({ include: [ BlogPost ] }) // 打印查询结果 console.log(JSON.stringify(users, null, 2)) } main()
在上面的例子中,首先定义了一个 User 实体和一个 BlogPost 实体,它们之间的关系是一对多。然后通过 User.hasMany(BlogPost) 和 BlogPost.belongsTo(User) 建立了它们之间的关系。
在 main 函数中,通过 User.create 创建了一个用户,然后创建了两篇博客文章并分别设置了它们的 userId 属性,以建立博客文章和用户之间的关系。
最后,通过 User.findAll 加上 include 参数来查询所有用户及其博客文章。查询结果如下所示:
[ { "id": 1, "name": "Tom", "createdAt": "2021-08-31T08:21:14.746Z", "updatedAt": "2021-08-31T08:21:14.746Z", "blogPosts": [ { "id": 1, "title": "Post One", "userId": 1, "createdAt": "2021-08-31T08:21:14.749Z", "updatedAt": "2021-08-31T08:21:14.749Z" }, { "id": 2, "title": "Post Two", "userId": 1, "createdAt": "2021-08-31T08:21:14.749Z", "updatedAt": "2021-08-31T08:21:14.749Z" } ] } ]
可以看到,查询结果包含了用户及其博客文章的信息,因为在 include 参数中传递了 BlogPost 实体。
总结
本文介绍了 Sequelize 中使用 include 操作进行关联查询的方法,包括了关系模型的介绍和具体的代码实现。熟练掌握 include 操作可以让你在使用 Sequelize 进行开发的过程中更加得心应手,同时也能让你的代码更加清晰、简洁、易于维护。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659fca81add4f0e0ff84bb13