Haskell Esqueleto 项目到记录列表而不是元组

Haskell Esqueleto project to list of records instead of tuples

在我看到的所有示例中,esqueleto 的结果都投影到元组列表中。由于缺少标签,这使得编码和维护更加困难。

例如:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return (li ^. LogItemId, li ^. LogItemTitle)

有没有办法让 esqueleto 将结果投影到记录列表中?

实际上你自己构造元组。确实:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return <b>(li ^. LogItemId, li ^. LogItemTitle)</b>

因此您可以使用 (^.) :: (PersistEntity val, PersistField typ) => expr (Entity val) -> EntityField val typ -> expr (Value typ) "selector" 来获取字段并将它们包装到一个元组中。

如果你这样写:

previousLogItems >- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return <b>li</b>

您将获得 [Entity Foo] 的列表,其中 Foo 是您查询的对象类型。

您可以使用entityVal :: Entity a -> a获取包裹在Entity中的实体,例如:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return li
<b>mapM_ (print . entityVal) previousLogItems</b>

鉴于实体当然是 Show 的一个实例。