Yesod删除级联

时间:2012-09-16 07:24:10

标签: haskell yesod

根据http://www.yesodweb.com/blog/2010/07/database-migrations,几年前添加了DeleteCascade类型类。我只能假设这是为了添加到模型中。设置我的模型配置后如下:

Field
    ...
    foreignId ForeignId DeleteCascade

我的申请编译得很好。但是数据库模式没有改变,删除也不是由应用程序级联的。我应该(颤抖)手动做吗?还有更好的方法吗?

我正在使用Yesod脚手架(Application.hs,Foundation.hs,Settings.hs,...)

2 个答案:

答案 0 :(得分:9)

使用现有的答案,我花了一些时间来弄清楚如何使用删除级联。作为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与之前的效果相同。

答案 1 :(得分:4)

为了利用DeleteCascade,您需要使用deleteCascade或deleteCascadeWhere函数。这些只有在您的类型可用的DeleteCascade实例时才有效。获得这些的最简单方法是使用mkDeleteCascade函数。