📜  left join in sequelize - Javascript (1)

📅  最后修改于: 2023-12-03 15:02:40.156000             🧑  作者: Mango

用 Sequelize 进行左连接

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);

在这个模型中,我们定义了一个 userpost 表,并通过 hasManybelongsTo 建立了它们之间的一对多关系。要查询所有帖子及其关联的作者信息,我们可以像下面这样使用 findAll 函数:

const posts = await Post.findAll({
  include: [User],
});

在上面的查询中,我们使用 include 参数指定了 Post 模型关联的 User 模型,这将自动为我们执行一次左连接查询,返回所有帖子及其关联的作者信息。

左连接选项

在 Sequelize 中,我们可以使用从属模型上的 belongsTo 和其他模型上的 hasOnehasManybelongsToMany 来建立模型之间的关系。 在查询时,我们可以使用以下选项之一来指示 Sequelize 执行哪种类型的连接:

  • include:要包含在查询结果中的模型。
  • required:如果设置为 true,则只包括与主记录有匹配记录的关联记录。 如果设置为 false,则所有记录都将包括在结果中。
  • through:用于建立多对多关系的中间表。
  • attributes:要在关联模型中选择的属性列表。
  • where:用于限制关联行的条件。
  • order:指定关联行的排序规则。
  • limitoffset:用于限制关联记录的数量。
  • 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 参数强制执行内连接等等。