Sequelize更新嵌套关联

时间:2016-06-21 14:32:18

标签: node.js sequelize.js

我有一个实例,我有用户角色。我有以下内容:

  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});

使用UserId和RoleId列在DB中为数据库创建 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 ”表并更改给定 RoleId >用户ID 即可。我似乎无法弄清楚如何通过任何续集语法进入 UsersRoles 表格!

我可以编写一些原始SQL,但感觉不对?

修改

如果表格包含:

,我只想更新用户角色
| UserId | RoleId |
-------------------
|    1   |    1   |

我希望能够将其更改为:

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

但我无法弄清楚要执行此操作的代码!

2 个答案:

答案 0 :(得分:3)

无需直接与联接表进行交互 - 您只需执行

即可
user.setRoles([newRole]);

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

请注意,我正在传递数组,因为用户可以拥有多个角色 - set会删除当前分配的所有角色。如果要添加新角色并保留现有角色,请使用

user.addRole(newRole);

答案 1 :(得分:0)

您正在更新RoleId但尚未对其进行定义。如果您没有在表上定义主键,默认情况下Sequelize会根据id按名称定义主键,因此您应该id: req.body.role