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 Foos 的列表。您可以通过将get 替换为get404 或使用catMaybes 将其转换为Foos 列表。请注意,这是两种不同的方法:第一种方法,如果任何 ID 不存在,用户将得到 404。第二种方法,该键将被忽略。

【讨论】:

啊,谢谢!如果我有 mfooIds :: [Maybe (Key Foo)] 并想得到 mfoos :: [Maybe Foo] 怎么办?我将如何制作一个采用 Maybe Keyget 函数? 没关系,通过mfoos &lt;- runDB $ mapM (maybe (return Nothing) get) mfooIds得到它 如果数据库是远程的,runDB $ mapM get fooIdsfmap (runDB . get) fooIds 之间是否有任何区别(请求数量)? 每次 runDB 调用都会引入另一个数据库事务。【参考方案2】:

另一个有用的方法是

foos <- runDB $ mapM getJustEntity fooIds

【讨论】:

以上是关于yesod 持久性:从键列表中获取实体列表的主要内容,如果未能解决你的问题,请参考以下文章

yesod 持久:在小村庄内获取实体值

Yesod 持久示例

选择具有 yesod 持久性的列子集

Yesod 数据库持久记录访问

yesod 持久性依赖缺失

Yesod 持久代码的类型类约束