您好我有以下表格
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}之间的关联
答案 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()
中使用结果集。但我更喜欢通过直通模式建立联系。
如果您要删除仅基于群组名称或用户名的关联,您可以使用removeAssociation
或removeAssociations
执行此操作,并使用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);
});