【问题标题】:Sequelize - Nested include with N:M relationshipsSequelize - 嵌套包含 N:M 关系
【发布时间】:2021-05-01 13:07:42
【问题描述】:

我最近一直在努力解决一个我似乎无法弄清楚的问题。我们基本上有3个模型。 UserRoleOrganization。用户被分配到具有角色的组织。他可以在一个组织中担任多个角色。例如

它们通过另一个模型连接UserOrganization 当我尝试使用以下内容获取所有内容时

{
    model: Organization,
    required : true,
    include: [
        {
            model: Role,
            required : true
        },
    ],
}

我得到了一些奇怪的结果。用户很好,用户的组织很好,但在该组织内,获取的角色不是来自该特定用户。分配给该组织的角色是否分配给任何用户。

userOrganization.js

    UserOrganization.belongsTo(models.Organization, {
        foreignKey: 'organization_id',
    });
    UserOrganization.belongsTo(models.User, {
        foreignKey: 'user_id',
    });
    UserOrganization.belongsTo(models.Role, {
        foreignKey: 'role_id',
    });

user.js

    User.belongsToMany(models.Organization, {
        through: {
            model: models.UserOrganization,
            unique: false,
        },
        foreignKey: 'user_id',
        otherKey: 'organization_id',
    });
    User.belongsToMany(models.Role, {
        through: {
            model: models.UserOrganization,
            unique: false,
        },
        foreignKey: 'user_id',
        otherKey: 'role_id',
    });

组织.js

     Organization.belongsToMany(models.F5Connection, {
        through: {
            model: models.OrganizationF5Connection,
            unique: false,
        },
        foreignKey: 'organization_id',
        otherKey: 'f5_connection_id',
    });
    Organization.belongsToMany(models.Role, {
        through: {
            model: models.UserOrganization,
            unique: false,
        },
        foreignKey: 'organization_id',
        otherKey: 'role_id',
    });

角色.js

     Role.belongsToMany(models.User, {
        through: {
            model: models.UserOrganization,
            unique: false,
        },
        foreignKey: 'role_id',
        otherKey: 'user_id',
    });
    Role.belongsToMany(models.Organization, {
        through: {
            model: models.UserOrganization,
            unique: false,
        },
        foreignKey: 'role_id',
        otherKey: 'organization_id',
    });

我哪里出错了?有没有办法获取仅分配给他的角色的用户组织?另一种解决方案是获取用户角色,然后在结果之后将它们与组织进行匹配。

谢谢

【问题讨论】:

    标签: node.js sequelize.js sequelize-typescript


    【解决方案1】:

    问题是您将用户的角色和组织存储在同一级别的 UserOrganization 的一条记录中。
    请记住,您需要定义以下关联:

    user.js

    User.hasMany(models.UserOrganization, {
            foreignKey: 'user_id'
        });
    

    组织.js

    Organization.hasMany(models.UserOrganization, {
            foreignKey: 'organization_id'
        });
    

    角色.js

    Role.hasMany(models.UserOrganization, {
            foreignKey: 'role_id'
        });
    

    最后让用户了解他/她的角色和组织:

    const user = await User.findByPk(userId,
      include: [{
        model: UserOrganization,
        required : true,
        include: [
            {
                model: Role,
                required : true
            },
            {
                model: Organization,
                required : true
            },
        ],
    }]);
    

    这并不完全是您希望获得的,因为您将在这里获得所有用户的角色-组织对。由于您的数据结构,您无法获取用户的不同组织以及在每个组织内部获取该用户的不同角色。

    【讨论】:

    • 您会提出不同的方法吗?我虽然关于将用户组织关系存储在 1 个表上,然后基于该关系将多个角色存储在另一个表 user_organization_roles 上,其中有一个指向 user_organization 表的外键以避免有 2 个外键(用户+ 角色)
    • 这可能行得通。我刚刚得到了上述解决方案,因此您不应该更改数据库结构。但如果你准备好这样做,那就完全不同了!
    • 实际上将其更改为上述内容并且可以正常工作。虽然我不得不使用一些hasMany 关系,但我更喜欢belongsToMany。但总的来说,作为一个数据库结构,您认为这种方式更好吗?
    • 一个用户可以在两个或多个不同的组织中吗?
    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2014-08-08
    • 2017-08-27
    • 2021-02-09
    • 2016-03-16
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多