Rad*_*nev 14 cascading-deletes sails.js waterline
如堆栈溢出答案所示,在Waterline中不支持级联(特别是级联删除),通过使用(或用于软删除)生命周期回调并删除相关记录,可以解决一对多关联问题.第二个查询.这可以通过内部实现.afterDestroyafterUpdateManyModel.destroy({ oneModel: _.pluck(destroyedOneModels, "id") })afterDestroy
我们如何为多对多关系做到这一点(考虑到内部使用联结表,我们必须从中删除记录)?
Ale*_*N-o 10
我使用sails 0.11 的文档中的Pet/ Userexample做了一些测试.
在Pet模型users中写入此生命周期回调会在删除pet 之前删除与a关联的所有内容.
// models/Pet.js
module.exports = {
attributes: {
name:'string',
color:'string',
owners: {
collection: 'user',
via: 'pets'
}
},
beforeDestroy: function(criteria, cb) {
// Destroy any user associated to a deleted pet
Pet.find(criteria).populate('owners').exec(function (err, pets){
if (err) return cb(err);
pets.forEach(function(recordToDestroy) {
User.destroy({id: _.pluck(recordToDestroy.owners, 'id')}).exec(function(err) {
console.log('The users associated to the pet ' + recordToDestroy.name + ' have been deleted');
});
});
cb();
})
}
};
Run Code Online (Sandbox Code Playgroud)
我无法在afterDestroy生命周期回调中执行此操作,因为删除的记录的多对多属性在那里丢失.
Waterline自动删除联结表的记录.
这个功能的问题在于,如果某些宠物共享一些所有者,它可能会删除太多东西.按照文档示例,如果您删除宠物Rainbow Dash,您将删除用户Mike,Cody和Gabe,并且宠物Pinkie Pie和Applejack将成为孤儿.
如果您定义像这样的多对多关系,但您知道宠物不能拥有任何所有者,那么它可以正常工作.否则,您应该添加一项测试,以检查您是否不会让另一只宠物成为孤儿.
| 归档时间: |
|
| 查看次数: |
3594 次 |
| 最近记录: |