嗨,我有以下几张桌子

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']

所以我需要删除工作组和{Alice和Bob}之间的关联

最佳答案

使用"through": "UsersGroup"将自动创建一个新的模型UsersGroup,但是它不会将其与用户和组直接关联。所以我要做的是创建一个新的sequelize模型UsersGroup,它包含任何属性和键,并定义与用户和组的关联。然后,不用将“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在传递空数组时表现得很有趣。
另外,如果在usersgroup表中没有id作为主键,可以很容易地修改上面的代码,以使用用户id和组id的组合-只需修改where语句。
另一种方法是分别选择用户和组,并在UsersGroups.destroy()中使用结果集。但我更喜欢有一个协会,即使从一个通过模式。
如果您只是基于组名或用户名删除关联,那么您可以使用removeAssociationremoveAssociationshave a loojhere

09-25 21:15