Sails.js / Waterline级联删除多对多关联

时间:2014-12-23 16:25:16

标签: sails.js waterline cascading-deletes

stackoverflow answer所示,在Waterline中不支持级联(特别是级联删除),使用{{1}可以解决一对多关联的问题。 (或afterDestroy用于软删除)生命周期回调并使用第二个查询删除关联的记录。这可以通过afterUpdate内的ManyModel.destroy({ oneModel: _.pluck(destroyedOneModels, "id") })来实现。

我们如何为多对多关系做到这一点(请记住在内部使用联结表,我们必须从中删除记录)?

1 个答案:

答案 0 :(得分:9)

我使用风帆0.11的Pet / User example from the documentation进行了一些测试。

Pet模型中编写此生命周期回调会删除与<{1}} 关联的所有users,然后再删除它。

pet

我无法在// 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(); }) } }; 生命周期回调中执行此操作,因为此处缺少已删除记录的多对多属性。

Waterline会自动删除联结表的记录。

此功能的问题在于,如果某些宠物共享某些所有者,它可能会删除太多内容。按照文档示例,如果删除宠物 Rainbow Dash ,您将删除用户 Mike Cody Gabe < / em>,宠物 Pinkie Pie Applejack 将成为孤儿。

如果您定义了这样的多对多关系,但您知道宠物不能拥有任何共同拥有者,那么它可以正常工作。否则,您应该添加一项测试,以检查您是否不会让另一只宠物成为孤儿。