使用sequelize管理基于项目的用户角色

时间:2015-12-27 11:28:13

标签: postgresql roles sequelize.js user-roles

我在节点应用程序中使用sequelize(postgreSQL)。现在我正在尝试将用户角色更改为基于项目的角色。

到目前为止它看起来像:

 User.belongsToMany(Project, { through: 'ProjectUser' }),
 User.belongsToMany(Role, { through: 'RoleUser' }),
 Project.belongsToMany(User, { through: 'ProjectUser' }),
 Role.belongsToMany(User, { through: 'RoleUser' })

但是在这种情况下,如果我允许用​​户执行操作而不是在所有项目中允许操作。所以我的想法是只使用一个连接表和三个名为ProjectRoleUser的引用。

现在我用:

User.hasMany(ProjectRoleUser),
User.belongsToMany(Project, { through: 'ProjectRoleUser' }),
User.belongsToMany(Role, { through: 'ProjectRoleUser' }),
Project.hasMany(ProjectRoleUser),
Project.belongsToMany(User, { through: 'ProjectRoleUser' }),
Role.hasMany(ProjectRoleUser),
Role.belongsToMany(User, { through: 'ProjectRoleUser' })

这完全没问题。所以连接表看起来像:

ProjectId, RoleId, UserId
1, 2, 1
1, 1, 1
2, 1, 1
2, 3, 1
1, 1, 2
2, 1, 2

有一种很好的方式来请求结果,如:

{
   "id": 1,
   "username": "testuser",
   "Projects": [
      {
         "id": 1,
         "projectname": "sampleproject1",
         "Roles": [
            {
               "id": 1,
               "rolename": "Viewer"
            }, {
               "id": 2,
               "rolename": "Author"
            }
         ]
      }, {
         "id": 2,
         "projectname": "second project",
         "Roles": [
            {
               "id": 1,
               "rolename": "Viewer"
            }, {
               "id": 3,
               "rolename": "Co-Author"
            }
         ]
      }
   ]
}, {
... 
}

无法理解如何将其包含在一个查询中。任何帮助都会很好..

编辑:

我现在得到了一个现在有效的解决方案。但它并不是很干净。任何人都知道一种更简单的方法,而不是使用三种包含?

User.findAll({
        include: [{ 
            model: Project,
            include: [{
                model: Role,
                include: [{
                    model: ProjectRoleUser,
                    attributes: [],
                    where: { UserId: { $col: 'User.id' } }
                }]
            }]
        }]
    })

0 个答案:

没有答案