说,在Yesod / Persistent中,我的模型设置如下:
User
ident Text
password Text Maybe
UniqueUser ident
Question
title Text
asker UserId Eq
我有一个Question
的列表,并希望检索相应的User
列表。我该怎么做呢?
我考虑过加入,但这些是一对多的,而不是一对一的(我想这没关系,但我想要一个更简单的解决方案)。手动进行连接也是一种选择,但我担心性能 - 我有
questions <- runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10]
let askerIds = map (\(Entity _ q) -> questionAsker q) questions
askers <- sequence $ map (runDB . get) askerIds
let questionsAndAskers = zip questions askers
但是我担心在runDB
中使用map
(不会为每个用户单独向数据库发出请求吗?)
是否有更好/更惯用的方法来实现这一目标?
答案 0 :(得分:6)
我还没有对此进行过类型检查,但我会把整个事情都放在runDB
内:
runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10] >>= mapM (\qe@(Entity _ q) -> do
asker <- get $ questionAsker q
return (qe, asker))
答案 1 :(得分:1)
怎么样:
questions <- runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10]
let askerIds = map (\(Entity _ q) -> questionAsker q) questions
askers <- runDB $ selectList [UserId <-. askerIds] []
let questionsAndAskers = zip questions askers
这似乎应该为用户点击一次数据库。