在所有示例中,我看到esqueleto的结果被投射到元组列表中。由于缺少标签,这使得编码和维护更加困难。
例如:
previousLogItems <- select $ from $ \li -> do
orderBy [desc (li ^. LogItemId)]
limit 10
return (li ^. LogItemId, li ^. LogItemTitle)
有没有办法让esqueleto将结果投影到记录列表?
答案 0 :(得分: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
的实例。