На самом деле вы сами создаете кортеж. Действительно:
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)
«селектор», чтобы получить поля и обернуть их в кортеж.
Если вы напишите это как:
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
.