如果您具有以下实体:用户,角色,组织。 您想要设置关系,以便每个用户都有一个组织角色。
简单来说,每个用户可以属于多个组织,并且该用户在每个组织中都有特定的角色。
您将如何使用Sequelize对此建模?
我尝试过创建一个名为organisation_users的联结表,然后在该表中添加一个organisationUsers.belongsTo(role); 从我的阅读中,Sequelize不支持联结表上的关联,因此该解决方案不起作用。
关于, 埃米尔
答案 0 :(得分:1)
Sequelize确实支持联接表上的关联。您应该查看“通过”选项here >
示例:
const Asso_Organization_User = sequelize.define('Asso_Organization_User', {
id: DataTypes.STRING,
userId: DataTypes.STRING,
organizationId: DataTypes.STRING
});
User.Organizations = User.belongsToMany(Organization, {
through: Asso_Organization_User,
foreignKey: 'userId',
otherKey: 'organizationId',
as: 'organizations'
})
但是您的情况有点特殊,我看不到使用sequelize来获取用户,其所有组织及其在同一查询中每个组织的角色的方法。 基于此问题,看来尚无解决方案:https://github.com/sequelize/sequelize/issues/6671
也许您可以在两个查询中做到这一点:获取所有组织和所有角色,然后将它们与代码合并。
实际上,我看到了另一个解决方案:
const Asso_Organization_User = sequelize.define('Asso_Organization_User', {
id: DataTypes.STRING,
userId: DataTypes.STRING,
organizationId: DataTypes.STRING
});
User.Organizations = User.belongsToMany(Organization, {
through: Asso_Organization_User,
foreignKey: 'userId',
otherKey: 'organizationId',
as: 'organizations'
})
该模型如下所示:
User: id
Role: id, userId, organizationId
Organizations: id
Asso_Organization_User: id, userId, organizationId
然后:
User.Organizations = User.belongsToMany(Organization, {
through: Asso_Organization_User
})
Organization.Roles = Organization.haMany(Role, {
foreignKey: 'organizationId'
})
然后您应该可以查询:
User.findAll({
include: [ {
model: Organization,
include: {
model: Role
}
} ]
where: {
'role.userId': Sequelize.col("User.id")
}
});
我不确定确切的语法,但是将Sequelize.col与hasMany结合使用是可以的。但是请注意,如果不添加where子句,它将返回每个组织的所有角色(对于在该组织中具有角色的每个用户)。