假设我有以下Yesod(Database.Persist)数据库模式:
File
path Text
Tag
name Text
FileTag
file FileId
tag TagId
UniqueFileTag file tag
Yesod选择给定Tag记录引用的文件记录的最方便方法是什么?我需要求助于自定义SQL吗?我正在使用PostgreSQL作为数据库后端。
答案 0 :(得分:3)
您可以使用自定义SQL来解决此问题;我不认为Persistent提供了不同的解决方案,因为它不是ORM,因为它必须支持像MongoDB这样的非关系后端。
您可以实现这样的基本联接:
let tagFileStatement =
Text.concat
[ "SELECT ?? "
, "FROM file, file_tag "
, "WHERE file.id = file_tag.file "
, "AND ? = file_tag.tag"
]
files <- runDB $ rawSql tagFileStatement
[toPersistValue theTagIdThatYouWantToLookupFilesFor]
files :: [Entity File]
答案 1 :(得分:0)
有一个用于处理一对多关系的模块,可以是application-level joins,也可以是a proper SQL join。遗憾的是,这些模块可能算作整个Yesod项目中记录最差的方面。从长远来看,我们希望改进更复杂的SQL查询的状态,但我们现在没有任何实际的代码可以显示。
Yesod邮件列表上有几个主题,包括如何使用这些主题,这里有一个弹出的主题:https://groups.google.com/forum/#!msg/yesodweb/a4EAvPS8wFA/ClPuS94TRFwJ%5B1-25%5D。我们真的需要改进Haddocks或者写一个详细描述行为的维基页面。