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

标签 sails.js waterline cascading-deletes

如图stackoverflow answer由于 Waterline 不支持级联(特别是级联删除),因此可以通过使用 afterDestroy (或 afterUpdate 用于软删除)生命周期回调并使用第二个查询删除关联记录。这可以通过 afterDestroy 中的 ManyModel.destroy({ oneModel: _.pluck(destroyedOneModels, "id") }) 实现。

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

最佳答案

我使用 Pet / User example from the documentation 做了一些测试风 sails 0.11。

Pet模型中编写此生命周期回调会在删除pet之前删除与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();
    })
  }

};

我无法在 afterDestroy 生命周期回调中执行此操作,因为那里缺少已删除记录的多对多属性。

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

此功能的问题在于,如果某些宠物共享某些主人,它可能会删除太多内容。按照文档的示例,如果您删除宠物 Rainbow Dash,您将删除用户 MikeCodyGabe,而宠物萍琪派苹果 jack 将成为孤儿。

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

关于Sails.js/Waterline 多对多关联的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624214/

相关文章:

ios - CoreData + iCloud + 级联删除 - 如何处理?

jquery - Marionette CompositeView AttachHtml after 而不是追加

node.js - 如何在 sailsjs 中验证模型

node.js - 端口 100 未在本地主机的 Node.js 中运行

node.js - 如何通过sails.js中的查询参数有选择地填充水线关联

Sails.js 模型 - 创建与自身的关联?

node.js - sails.js + waterline One-To-Many模型关联,删除Many时会发生什么?

node.js - Node 模块未使用足够的 CPU 资源

iPhone核心数据: Cascading delete across a many-to-one relationship