2014-01-27 22 views
2

在使用laravel的多態關係時保持數據庫完整性的最佳實踐是什麼?Laravel多態關係/模型觀察者和數據庫完整性

我正在使用模型觀察者來更新/刪除相關模型。因此,例如,我在刪除客戶時刪除了有關「已刪除」事件的相關文檔。 這意味着如果在刪除第一個文檔時發生錯誤,其餘的將保留在數據庫中......或者如果我在事務中刪除文檔,則它們全部將保留在數據庫中,而父對象將被刪除...

回答

0

不幸的是,這個問題沒有很好的答案。由於多態關係,您無法使用外鍵保持數據庫的完整性。

嘗試的一種方法是使用數據庫觸發器。由於Laravel多態系統在引用相關模型的表上保留一個「類型」列,因此可以在可以變形的表上放置一個「before delete」觸發器,以刪除所有引用要刪除的原始對象的事件。

例如,在Laravel documentation用的結構:

staff 
    id - integer 
    name - string 

orders 
    id - integer 
    price - integer 

photos 
    id - integer 
    path - string 
    imageable_id - integer 
    imageable_type - string 

你可以把一個「之前刪除」觸發器上staff表執行查詢(這裏的PostgreSQL語法)這樣的:

DELETE FROM photos WHERE imageable_id = OLD.id AND imageable_type = 'staff' 

這樣,每次刪除員工原料時,所有參考照片都將在同一交易中刪除。

我真的不知道這是否是保持這種關係完整性的最好方法,但它似乎是一個有效的關係。