gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:17:06 25 4
gpt4 key购买 nike

考虑模型:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com