Yesod / Persistent一对一查询

时间:2012-02-22 02:15:45

标签: haskell yesod

说,在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(不会为每个用户单独向数据库发出请求吗?)

是否有更好/更惯用的方法来实现这一目标?

2 个答案:

答案 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

这似乎应该为用户点击一次数据库。