admin

如何使用Sequelize在联接表上生成查询?

sql

我们说有两个表,即“用户”和“用户角色”。用户和用户角色之间的关系是一对多的。用户的Sequelize模型如下:

const user = sequelize.define(
  'user', {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    userName: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'username'
    },
    password: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'password'
    }
  }, {
    tableName: 'user'
  }
);

用户角色的续集模型如下-

const userRole = sequelize.define(
  'userRole', {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    userId: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'user_id'
    },
    password: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'password'
    }
  }, {
    tableName: 'userRole'
  }
);

Sequelize关联定义如下:

user.hasMany(models.userRole, { foreignKey: 'user_id', as: 'roles' });
userRole.belongsTo(models.user, { foreignKey: 'user_id', as: 'user' });

我想使用生成以下查询

Sequelize -
SELECT * 
FROM   USER 
       INNER JOIN (SELECT user_role.user_id, 
                          role 
                   FROM   user_role 
                          INNER JOIN USER tu 
                                  ON tu.id = user_role.user_id 
                   GROUP  BY user_id 
                   ORDER  BY role) AS roles 
               ON USER.id = roles.user_id;

我正在开发一个API,该API将由前端网格使用以显示用户信息。用户角色表的角色属性具有搜索功能。如果特定用户的任何角色都匹配,那么我希望获得一条包含与该用户相关联的所有角色的用户记录。


阅读 210

收藏
2021-07-01

共1个答案

admin

要获得与用户相关联的所有角色,即使其中一个与查询匹配,也需要定义另一个关联,以便可以在sequelize语句中两次包含角色表。

User.hasMany(models.UserRole, { foreignKey: 'user_id', as: 'roles2' });

后记语句-

const userInfo = await User.findAndCountAll({
  include: [
    {
      model: UserRole,
      attributes: ['id', 'role'],
      as: 'roles',
      where: { [Op.or]: [{ role: { [Op.like]: '%MANAGER%' } },
      required: true
    },
    {
      model: UserRole,
      attributes: ['id', 'role'],
      as: 'roles2',
      required: true
    } 
  ],
  where: whereStatement,
});

借助第一个包含(联接)功能,您可以根据用户角色过滤用户记录,而借助第二个包含(联接)功能,您可以获取角色之一匹配的用户的所有角色。

2021-07-01