2012-09-16 154 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)。使用这些功能没有问题。不幸的是,我没有一个完整的例子,但是。 –