2012-09-16 151 views
8

根據http://www.yesodweb.com/blog/2010/07/database-migrations一個DeleteCascade typeclass幾年前添加。我只能假設這是爲了添加到模型中。設置我的模型配置後,像這樣:Yesod刪除級聯

Field 
    ... 
    foreignId ForeignId DeleteCascade 

我的應用程序編譯得很好。但數據庫模式不變,應用程序也不會級聯刪除。我應該(不寒而慄)手動嗎?有沒有更好的辦法?

我使用耶索德支架(Application.hs,Foundation.hs,Settings.hs,...)

回答

8

使用現有的答案,我花了一些時間來弄清楚如何使用刪除級聯。作爲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處理程序,你必須使用deleteCascadedeleteCascadeWhere,而不是刪除。

runDB $ deleteCascade entryId 

使用delete的效果與以前相同。

4

爲了充分DeleteCascade的優勢,你需要使用任一deleteCascade或deleteCascadeWhere功能。這些僅在DeleteCascade實例可用於您的類型時纔有效。最簡單的方法是使用mkDeleteCascade函數。

+0

感謝迄今爲止的答案。你能擴展一下嗎?我的問題: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

+0

有關內部使用或常規用戶的意見並未應用於功能本身,而是應用於模塊。鏈接到的這些模塊都由其他模塊重新導出(例如,Yesod.Persist)。使用這些功能沒有問題。不幸的是,我沒有一個完整的例子,但是。 –