使用現有的答案,我花了一些時間來弄清楚如何使用刪除級聯。作爲Yesod的初學者,我沒有關於Yesod的概述。
要獲得工作刪除級聯,您不需要更改模型中的任何內容。假設您的實體文件如下所示,並且您想要刪除Entry
。
Entry
title Text
Comment
entry EntryId
您不必更改此實體文件。
您從哪裏領導實體的代碼通常在Model.hs
中看起來就像那樣。
share [ mkPersist sqlOnlySettings
, mkMigrate "migrateAll" ]
$(persistFileWith lowerCaseSettings "config/models")
添加mkDeleteCascade以獲取實體的DeleteCascades實例。
share [ mkPersist sqlOnlySettings
, mkDeleteCascade sqlOnlySettings
, mkMigrate "migrateAll" ]
$(persistFileWith lowerCaseSettings "config/models")
一旦你要刪除的條目,例如在postDeleteEntryR
處理程序,你必須使用deleteCascade
或deleteCascadeWhere
,而不是刪除。
runDB $ deleteCascade entryId
使用delete
的效果與以前相同。
感謝迄今爲止的答案。你能擴展一下嗎?我的問題:http://hackage.haskell.org/packages/archive/persistent-template/1.0.0/doc/html/Database-Persist-TH.html說,普通用戶不應該需要使用mkDeleteCascade。 http://hackage.haskell.org/packages/archive/persistent/1.0.0/doc/html/src/Database-Persist-Query-Internal.html表示deleteCascadeWhere僅供內部使用。我也找不到有關deleteCascade的任何有用的文檔。你能告訴我一個這個最小的工作例子嗎? – abesto
有關內部使用或常規用戶的意見並未應用於功能本身,而是應用於模塊。鏈接到的這些模塊都由其他模塊重新導出(例如,Yesod.Persist)。使用這些功能沒有問題。不幸的是,我沒有一個完整的例子,但是。 –