假设我有以下 Yesod (Database.Persist) 数据库模式:
File
path Text
Tag
name Text
FileTag
file FileId
tag TagId
UniqueFileTag file tag
Yesod中选择给定Tag记录引用的文件记录最方便的方法是什么?我需要求助于自定义 SQL 吗?我使用 PostgreSQL 作为数据库后端。
您可以使用自定义 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]
有一个用于处理一对多关系的模块,可以作为应用程序级连接,也可以作为适当的 SQL 连接。不幸的是,这些模块可能算作整个 Yesod 项目中文档记录最差的方面。从长远来看,我们希望改善更复杂的 SQL 查询的状态,但我们目前没有任何实际代码可以展示。
Yesod 邮件列表中有几个线程介绍了如何使用这些线程,这是弹出的一个线程:https ://groups.google.com/forum/#!msg/yesodweb/a4EAvPS8wFA/ClPuS94TRFwJ%5B1-25%5D . 我们真的需要改进 Haddocks 或编写一个 wiki 页面来更好地详细说明这种行为。