Say, in Yesod/Persistent, I have models setup like so:
User
ident Text
password Text Maybe
UniqueUser ident
Question
title Text
asker UserId
How about:
questions <- runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10]
let askerIds = map (\(Entity _ q) -> questionAsker q) questions
askers <- runDB $ selectList [UserId <-. askerIds] []
let questionsAndAskers = zip questions askers
That seems like it should hit the DB once for the users.
I haven't type-checked this yet, but I would stick the whole thing inside of runDB
:
runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10] >>= mapM (\qe@(Entity _ q) -> do
asker <- get $ questionAsker q
return (qe, asker))