我们说有两个表,即“用户”和“用户角色”。用户和用户角色之间的关系是一对多的。用户的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将由前端网格使用以显示用户信息。用户角色表的角色属性具有搜索功能。如果特定用户的任何角色都匹配,那么我希望获得一条包含与该用户相关联的所有角色的用户记录。
要获得与用户相关联的所有角色,即使其中一个与查询匹配,也需要定义另一个关联,以便可以在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, });
借助第一个包含(联接)功能,您可以根据用户角色过滤用户记录,而借助第二个包含(联接)功能,您可以获取角色之一匹配的用户的所有角色。