haskell - 使用 yesod 坚持执行 "join"的正确方法

标签 haskell persistent yesod

考虑模型:

Player
    name Text
    nick Text
    email Text Maybe
    phone Text Maybe
    note Textarea Maybe
    minutes Int Maybe
    deriving

Table
    name Text
    game Text
    pointsHour Int
    seats Int Maybe
    description Text Maybe
    deriving

GamingSession
    start UTCTime
    end UTCTime Maybe
    player PlayerId
    table TableId
    seat Int Maybe
    deriving

和函数

getGamingSessionsR :: Handler RepHtml
getGamingSessionsR = do
  sessions <- runDB $ selectList [GamingSessionEnd ==. Nothing] [Desc GamingSessionTable]
  defaultLayout $(widgetFile ("opensessions"))

如何获取每个关联 session 的所有玩家名称?

正在做

players <- runDB $ selectList [FilterOr . map (\(Entity _ s) -> PlayerId ==. (GamingSessionPlayer s)) $ sessions] []

获取玩家列表;但它根本与 session 无关

最佳答案

目前持久性中的连接支持有限,我相信它只是 SQL。

我有几个助手,用于处理简单的情况。可以找到它们here 。它不是真正的 JOIN,它为每个表选择一次,然后构建一个表示“连接”行的元组列表,其中每个行都有一个元素。

考虑到您的模型和助手,您应该能够执行以下操作:

records <- runDB $ do
    sessions <- selectList [] []
    players  <- selectList [] []
    tables   <- selectList [] []

    return $ joinTables3 gamingSessionPlayer gamingSessionTable sessions players tables

forM records $ \(session, player, table) -> do
    --
    -- ...
    --

仅返回所有三个表中都存在一条记录的情况(因此它是 INNER JOIN),但您可能也希望进行预过滤以提高效率。

关于haskell - 使用 yesod 坚持执行 "join"的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779253/

相关文章:

haskell - 使用 F# 中的 Applicative 功能构建记录

sql - 如何在 Excel 的 VBA 中使 ADODB.Connection 持久化?

PHP、MySQL和大量的简单查询

haskell - 从 Esqueleto `Maybe (Entity a)` 返回 `LeftOuterJoin`

session - 如何在 Yesod 中为一组特定的 url 或子站点禁用 session ?

haskell - 我如何创建一个 IO Bool 暂时返回 True,然后返回 False?

haskell - 具有 Bound 的相互递归语法

haskell - 关于 Haskell/HappStack 中的语法和类型签名的新手问题

http - 每个 HTTP 请求都使用一个单独的 TCP 连接

haskell - 在 Yesod 中强制 Julius 重新插值或如何避免在客户端密集型应用程序中对服务器进行双重标记