我在节点应用程序中使用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' } }
}]
}]
}]
})