在 Sequelize 中如何使用 include 操作进行关联查询

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


纠错反馈