Haskell Esqueleto проект для списка записей вместо кортежей
Во всех примерах, которые я видел, результаты esqueleto проецируются в список кортежей. Это усложняет кодирование и обслуживание из-за отсутствия меток.
Например:
previousLogItems <- select $ from $ \li -> do
orderBy [desc (li ^. LogItemId)]
limit 10
return (li ^. LogItemId, li ^. LogItemTitle)
Есть ли способ заставить esqueleto проецировать результаты в список записей?
1 ответ
Решение
На самом деле вы сами создаете кортеж. В самом деле:
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
,