Sequelize:如何在3个表之间建立关系

时间:2018-07-26 07:46:21

标签: sequelize.js

如果您具有以下实体:用户,角色,组织。 您想要设置关系,以便每个用户都有一个组织角色。

简单来说,每个用户可以属于多个组织,并且该用户在每个组织中都有特定的角色。

您将如何使用Sequelize对此建模?

我尝试过创建一个名为organisation_users的联结表,然后在该表中添加一个organisationUsers.belongsTo(role); 从我的阅读中,Sequelize不支持联结表上的关联,因此该解决方案不起作用。

关于, 埃米尔

1 个答案:

答案 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子句,它将返回每个组织的所有角色(对于在该组织中具有角色的每个用户)。