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'
}
);
用户角色的 Sequelize 模型如下 -
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,前端网格将使用它来显示用户信息。用户角色表的角色属性具有搜索功能。如果匹配特定用户的任何角色,那么我希望用户记录包含与该用户关联的所有角色。
解决方案
要获取与用户关联的所有角色,即使其中一个与查询匹配,您需要定义另一个关联,以便您可以在 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,
});
在第一个包含(join)的帮助下,您可以根据用户角色过滤用户记录,在第二个包含(join)的帮助下,您可以获取其中一个角色匹配的用户的所有角色。
推荐阅读
- python - 外键不起作用 - sqlite3.OperationalError:外键定义中的未知列“user_id”
- html - 如何以角度 9将字节 [] 渲染为图像
- java - 如何在maven webapp Servlet项目中连接数据库mysql?
- graph - 如何使用 gremlin 初始化数据库名称?并保存它?
- android - 难以重复信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),故障地址 0x8
- flutter - 如何生成 3 个唯一随机数,不包括特定编号。在飞镖?
- json - PowerShell 生成的 JSON 和 CloudFlares API 的问题
- c# - DapperPlus 和 Oracle,在插入数据库时知道哪一行抛出错误
- flutter - 谷歌地图在颤动屏幕中无法正确显示
- flutter - 点击不同类型的通知,颤动重定向到不同的页面