1

假设我有以下 Yesod (Database.Persist) 数据库模式:

File
   path Text

Tag
   name Text

FileTag
   file FileId
   tag TagId
   UniqueFileTag file tag

Yesod中选择给定Tag记录引用的文件记录最方便的方法是什么?我需要求助于自定义 SQL 吗?我使用 PostgreSQL 作为数据库后端。

4

2 回答 2

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]
于 2012-08-13T13:31:28.513 回答
0

有一个用于处理一对多关系的模块,可以作为应用程序级连接,也可以作为适当的 SQL 连接。不幸的是,这些模块可能算作整个 Yesod 项目中文档记录最差的方面。从长远来看,我们希望改善更复杂的 SQL 查询的状态,但我们目前没有任何实际代码可以展示。

Yesod 邮件列表中有几个线程介绍了如何使用这些线程,这是弹出的一个线程:https ://groups.google.com/forum/#!msg/yesodweb/a4EAvPS8wFA/ClPuS94TRFwJ%5B1-25%5D . 我们真的需要改进 Haddocks 或编写一个 wiki 页面来更好地详细说明这种行为。

于 2012-08-13T17:27:05.057 回答