选择Yesod中另一个表引用的行

时间:2012-08-13 12:53:05

标签: haskell yesod

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

File
   path Text

Tag
   name Text

FileTag
   file FileId
   tag TagId
   UniqueFileTag file tag

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

2 个答案:

答案 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或者写一个详细描述行为的维基页面。