Sequelize删除多个关联

时间:2016-07-07 05:34:27

标签: mysql node.js sequelize.js

您好我有以下表格

models.User= sequelize.define("User", {
   name: {
      type: DataTypes.STRING, allowNull: false, unique: true
    }
});
models.Group= sequelize.define("Group", {
   name: {
      type: DataTypes.STRING, allowNull: false, unique: true
    }
});


db.User.belongsToMany(db.Group, {
  "through": "UsersGroup"
});

db.Group.belongsToMany(db.User, { 
  "through": "UsersGroup"
});

是否有办法在给定组名称和要删除的名称(用户)的情况下立即从组中删除多个用户?

像:

var groupName = 'Work';

var users = ['Alice','Bob']

所以我需要删除Work group和{Alice and Bob}之间的关联

2 个答案:

答案 0 :(得分:1)

使用"through": "UsersGroup"会自动创建一个新的Model UsersGroup,但它不会直接将其与User和Group关联。所以我要做的是创建一个新的sequelize模型UsersGroup,其中包含任何属性和键,并定义与User和Group的关联。然后而不是传递" UsersGroup"字符串到belongsToMany,您直接将模型用作db.UsersGroup。

models.UsersGroup = sequelize.define("UsersGroup", {});

db.UsersGroup.belongsTo(db.User);
db.UsersGroup.belongsTo(db.Group);
db.UsersGroup.findAll({attributes:['id'], include:[
  {model: db.User, where: {name: {$in:['Alice','Bob']}}},
  {mode: db.Group, where: {name: 'Work'}}
]}).then(function(toBeDeleted){
  return db.UsersGroups.destroy({where:{id:{$in:toBeDeleted.map(function(d){ return d.id})}}})
}).then(function(){
  ....
}).catch(function(dbErr){throw err;})

你也可能想检查if toBeDeleted.length > 0因为我记得当一个空数组通过时,sequelize表现得很有趣。

如果您没有在usergroup表中将id作为主键,您可以轻松修改上面的代码以使用user_id和group_id的组合 - 只需修改where语句。

另一种方法可能是单独选择用户和组,并在UsersGroups.destroy()中使用结果集。但我更喜欢通过直通模式建立联系。

如果您要删除仅基于群组名称或用户名的关联,您可以使用removeAssociationremoveAssociations执行此操作,并使用looj here

答案 1 :(得分:0)

结束这样做(角色 - >组,动作 - >用户)

  var role = JSON.parse(req.body.role);
  var actions = JSON.parse(req.body.actions);
  var actionNames = _.map(actions, function (action) { return action.name });
  models.Role.findOne({ where: { name: role.name } }).then(function (_role) {
    if (_role == null) {
      res.status(500).send("role was not found");
    }
    else {
      models.Action.findAll({ where: { name: actionNames } }).then(function (actionsToRemove) {
        if (actionsToRemove == null) {
          res.status(500).send("No action [" + action.name + "] was found");
        }
        else {
          _role.removeActions(actionsToRemove).then(function (removedActions) {
            if (removedActions == null || removedActions != actions.length) {
              res.status(500).send(actions.length + " Action expected to be removed , but only [" + removedActions + "] were removed");
            }
            else {
              res.send("" + removedActions);
            }
          }).catch(function (err) {
            throw err;
          })
        }
      })
    }
  }).catch(function (err) {
    res.status(500).send(err);
  });