1

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

例如:

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

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

4

1 回答 1

4

事实上,你自己构建了元组。确实:

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

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

如果你这样写:

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

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

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

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

鉴于实体当然是Show.

于 2018-05-02T21:09:22.790 回答