2014-12-23 111 views
12

如該stackoverflow answer所示,具有級聯(級聯刪除尤其是)在水線不支持存在用於一個一對多協會一種解決方法通過使用afterDestroy(或afterUpdate進行軟刪除)生命週期回調並使用第二個查詢刪除相關記錄。這可以通過afterDestroy內的來實現。Sails.js /水線級聯刪除了許多一對多關聯

我們如何做到這一點爲多對多關係(記住一個聯結表在內部使用,我們必須從它刪除記錄)?

回答

7

我做了一些測試,使用Pet/User example from the documentation,風速爲0.11。

書面方式在Pet模型這個生命週期回調刪除關聯到pet所有users之前將其刪除。

// 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生命週期回調。

水線正在自動刪除聯結表的記錄。

此功能的問題是,如果有些寵物共享某些所有者,它可能會刪除太多東西。繼文檔的例子,如果你刪除寵物彩虹短跑,您將刪除用戶邁克科迪加布和寵物小指餡餅蘋果白蘭地是孤兒。

如果你定義了一個像這樣的多對多關係,但你知道寵物不能擁有任何共同的擁有者,那麼它工作得很好。否則,你應該添加一個測試來檢查你是否不會讓另一個寵物成爲孤兒。