2016-06-21 65 views
3

我有一个实例,我有用户角色。我有以下几点:更新嵌套关联

var User = sequelize.define("Users", { 
    username: DataTypes.STRING, 
    password: DataTypes.STRING, 
    }); 

    var Role = sequelize.define("Role", { 
    role: DataTypes.STRING 
    }); 

    var UsersRole = sequelize.define("UsersRole"); 

    User.belongsToMany(Role, {through: UsersRole}); 

与用户ID和角色ID列我创建一个数据库中的UsersRoles表。这一切工作正常,但现在我想能够更新用户角色,我不能解决如何做到这一点!我试着至今没有运气以下:

models.Users.findAll({ 
    where: { id: req.params.id }, 
    include: [{ all: true }] 
}).then(function(dbUser){ 
    dbUser[0].Roles[0].updateAttributes({ 
      RoleId: req.body.role, 
     }, 
     { 
      where: { UserId : req.params.id } 
     } 
    ).then(function (result) {... 

总之,所有我想做的就是能够改变一个用户的角色,所以更新“UsersRoles”表并更改角色ID给定用户标识。我似乎无法弄清楚如何通过任何续集语法来获取表格!

我可以写一些原始的SQL,但这不正确?

编辑

我只是想更新的用户角色,如果表中有:

| UserId | RoleId | 
------------------- 
| 1 | 1 |

我希望能够将其改为:

| UserId | RoleId | 
------------------- 
| 1 | 2 |

但我不能完全弄清楚这些代码!

回答

2

没有必要直接连接表互动 - 你可以简单地做

user.setRoles([newRole]); 
说我传递一个数组

http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/#setassociationsnewassociations-options-promise

注意,因为用户可以有多种角色 - set移除了所有当前分配的角色。如果你想添加一个新的角色,并保持现有的,使用

user.addRole(newRole); 
+1

一些注意事项:如果您只需要一个用户,请改用'findOne'或'findById'。另外,如果你不打算使用它们,则不需要“包含:全部” –

0

您正在更新RoleId但您尚未定义它。如果您没有在表上定义主键,默认情况下,Sequelize通过名称定义主键,如果id,则应该执行id: req.body.role

+0

其实“角色ID”在表中被创建作为协会的一部分,这是一个我想更新,sequelize创建的表我没有'id'列 – Jamie

+0

更新角色的另一种方式就像这个'dbUser [0] .Roles [0] .RoleId = req.body.role; dbUser [0] .Roles [0] .save();'。此外,为什么你需要第二个地方第一个条件将照顾过滤用户的地方。 –

+0

感谢您的答案,我试过这个,但它仍然无法正常工作,我担心我试图破解这一点,实际上有一种“续集”的方式来做到这一点,我应该试试呢? – Jamie