esqueleto icon indicating copy to clipboard operation
esqueleto copied to clipboard

aggregate entities

Open marcosh opened this issue 1 year ago • 0 comments

currently arrayAgg from Database.Esqueleto.PostgreSQL allows to aggregate Values.

It would be nice if it was possible also to aggregate entities.

For example, consider a 1:n relation between tables foo and bar. IT would be nice to write

data Baz = Baz
  { bazFoo :: Entity Foo
  , bazBars :: [Entity Bar]
  }

$(deriveEsqueletoRecord ''Baz)

query :: FooId -> SqlPersistT m [Baz]
query fooId =
  select $ do
    foo :& bar <-
      from $
        table @Foo
          `leftJoin` table @Bar
            `on` (\(foo :& bar) -> just foo.id ==. bar.foo)
    where_ $ foo.id = val fooId
    groupBy foo.id
    pure $
      SqlBaz
        { bazFoo = foo
        , bazBars = arrayAgg bar
        }

or something analogous

marcosh avatar Aug 16 '24 13:08 marcosh