9

根据http://www.yesodweb.com/blog/2010/07/database-migrationsDeleteCascade几年前添加了一个类型类。我只能假设这是要添加到模型中的。像这样设置我的模型配置后:

Field
    ...
    foreignId ForeignId DeleteCascade

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

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

4

2 回答 2

12

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

于 2014-07-12T10:40:35.150 回答
4

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

于 2012-09-16T09:28:02.833 回答