2
在使用laravel的多態關係時保持數據庫完整性的最佳實踐是什麼?Laravel多態關係/模型觀察者和數據庫完整性
我正在使用模型觀察者來更新/刪除相關模型。因此,例如,我在刪除客戶時刪除了有關「已刪除」事件的相關文檔。 這意味着如果在刪除第一個文檔時發生錯誤,其餘的將保留在數據庫中......或者如果我在事務中刪除文檔,則它們全部將保留在數據庫中,而父對象將被刪除...
在使用laravel的多態關係時保持數據庫完整性的最佳實踐是什麼?Laravel多態關係/模型觀察者和數據庫完整性
我正在使用模型觀察者來更新/刪除相關模型。因此,例如,我在刪除客戶時刪除了有關「已刪除」事件的相關文檔。 這意味着如果在刪除第一個文檔時發生錯誤,其餘的將保留在數據庫中......或者如果我在事務中刪除文檔,則它們全部將保留在數據庫中,而父對象將被刪除...
不幸的是,這個問題沒有很好的答案。由於多態關係,您無法使用外鍵保持數據庫的完整性。
嘗試的一種方法是使用數據庫觸發器。由於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'
這樣,每次刪除員工原料時,所有參考照片都將在同一交易中刪除。
我真的不知道這是否是保持這種關係完整性的最好方法,但它似乎是一個有效的關係。