使用现有的答案,我花了一些时间来弄清楚如何使用删除级联。作为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
处理程序,你必须使用deleteCascade
或deleteCascadeWhere
,而不是删除。
runDB $ deleteCascade entryId
使用delete
的效果与以前相同。
感谢迄今为止的答案。你能扩展一下吗?我的问题: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
有关内部使用或常规用户的意见并未应用于功能本身,而是应用于模块。链接到的这些模块都由其他模块重新导出(例如,Yesod.Persist)。使用这些功能没有问题。不幸的是,我没有一个完整的例子,但是。 –