📅  最后修改于: 2023-12-03 15:02:40.156000             🧑  作者: Mango
Sequelize 是一个面向对象的 Node.js ORM(对象关系映射)库,允许在 Node.js 应用程序中使用各种关系型数据库。
左连接是 SQL 中常用的一种连接类型,允许从两个或多个表中检索相关的数据。 在 Sequelize 中,我们可以使用 findAll
函数和 include
参数进行左连接操作。
Sequelize 使用起来非常简单,我们可以首先构建一个示例模型,如下所示:
const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');
class User extends Model {}
User.init({
name: DataTypes.STRING,
age: DataTypes.INTEGER,
}, { sequelize, modelName: 'user' });
class Post extends Model {}
Post.init({
title: DataTypes.STRING,
content: DataTypes.TEXT,
userId: DataTypes.INTEGER,
}, { sequelize, modelName: 'post' });
User.hasMany(Post);
Post.belongsTo(User);
在这个模型中,我们定义了一个 user
和 post
表,并通过 hasMany
和 belongsTo
建立了它们之间的一对多关系。要查询所有帖子及其关联的作者信息,我们可以像下面这样使用 findAll
函数:
const posts = await Post.findAll({
include: [User],
});
在上面的查询中,我们使用 include
参数指定了 Post
模型关联的 User 模型,这将自动为我们执行一次左连接查询,返回所有帖子及其关联的作者信息。
在 Sequelize 中,我们可以使用从属模型上的 belongsTo
和其他模型上的 hasOne
、hasMany
或 belongsToMany
来建立模型之间的关系。 在查询时,我们可以使用以下选项之一来指示 Sequelize 执行哪种类型的连接:
include
:要包含在查询结果中的模型。required
:如果设置为 true,则只包括与主记录有匹配记录的关联记录。 如果设置为 false,则所有记录都将包括在结果中。through
:用于建立多对多关系的中间表。attributes
:要在关联模型中选择的属性列表。where
:用于限制关联行的条件。order
:指定关联行的排序规则。limit
和 offset
:用于限制关联记录的数量。as
:在定义关联时指定的用于关联的名称。例如,我们可能只想返回发布时间在过去一周内的所有帖子及其作者。 在这种情况下,我们可以使用以下查询:
const posts = await Post.findAll({
include: [{
model: User,
where: { },
}],
where: {
createdAt: {
[Op.gt]: new Date(new Date() - 7 * 24 * 60 * 60 * 1000),
},
},
});
在上面的查询中,我们使用 where
参数指定了限制帖子发布时间的条件,并使用 include
参数指定关联的 User 模型,并在其中设置了 where
参数以限制返回的用户。
在 Sequelize 中进行左连接查询非常简单,只需要使用 findAll
函数和 include
参数,该参数允许我们指定要关联的模型,并自动执行左连接查询。 我们还可以使用其他选项来调整查询结果,例如使用 where
参数指定条件、使用 required
参数强制执行内连接等等。