Yesod删除级联

abe*_*sto 9 haskell yesod

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

Field
    ...
    foreignId ForeignId DeleteCascade
Run Code Online (Sandbox Code Playgroud)

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

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

小智 11

使用现有的答案,我花了一些时间来弄清楚如何使用删除级联.作为Yesod的初学者,我没有对Yesod的概述.

要获得有效的删除级联,您无需更改模型中的任何内容.假设你的实体文件如下所示,你想要删除它Entry.

Entry
    title Text
Comment
    entry EntryId
Run Code Online (Sandbox Code Playgroud)

您不必更改此实体文件.

您通常在其中引导实体的代码就是这样的代码Model.hs.

share [ mkPersist sqlOnlySettings
      , mkMigrate "migrateAll" ]
    $(persistFileWith lowerCaseSettings "config/models")
Run Code Online (Sandbox Code Playgroud)

添加mkDeleteCascade以获取实体的DeleteCascades实例.

share [ mkPersist sqlOnlySettings
      , mkDeleteCascade sqlOnlySettings
      , mkMigrate "migrateAll" ]
    $(persistFileWith lowerCaseSettings "config/models")
Run Code Online (Sandbox Code Playgroud)

一旦要删除条目,例如在postDeleteEntryR处理程序中,您必须使用deleteCascadedeleteCascadeWhere不删除.

runDB $ deleteCascade entryId
Run Code Online (Sandbox Code Playgroud)

使用delete具有与以前相同的效果.