嗨,我有以下几张桌子
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()
中使用结果集。但我更喜欢有一个协会,即使从一个通过模式。如果您只是基于组名或用户名删除关联,那么您可以使用
removeAssociation
或removeAssociations
have a loojhere