yesod 持久性:从键列表中获取实体列表
Posted
技术标签:
【中文标题】yesod 持久性:从键列表中获取实体列表【英文标题】:yesod persistent: get list of entities from list of keys 【发布时间】:2013-02-10 01:52:29 【问题描述】:假设我有fooIds :: [Key Foo]
。我如何获得foos :: [Foo]
?
我试过了
do
foos <- map get fooIds
但它给了我
No instance for (MonadBaseControl IO m0)
arising from a use of `get'
我假设是因为我需要使用runDB
。但我不太确定如何使用它。
【问题讨论】:
【参考方案1】:看起来像这样:
foos <- runDB $ mapM get fooIds
但是,这将为您提供Maybe Foo
s 的列表。您可以通过将get
替换为get404
或使用catMaybes
将其转换为Foo
s 列表。请注意,这是两种不同的方法:第一种方法,如果任何 ID 不存在,用户将得到 404。第二种方法,该键将被忽略。
【讨论】:
啊,谢谢!如果我有mfooIds :: [Maybe (Key Foo)]
并想得到 mfoos :: [Maybe Foo]
怎么办?我将如何制作一个采用 Maybe Key
的 get
函数?
没关系,通过mfoos <- runDB $ mapM (maybe (return Nothing) get) mfooIds
得到它
如果数据库是远程的,runDB $ mapM get fooIds
和 fmap (runDB . get) fooIds
之间是否有任何区别(请求数量)?
每次 runDB 调用都会引入另一个数据库事务。【参考方案2】:
另一个有用的方法是
foos <- runDB $ mapM getJustEntity fooIds
【讨论】:
以上是关于yesod 持久性:从键列表中获取实体列表的主要内容,如果未能解决你的问题,请参考以下文章