次のように定義されたデータ型があります。
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
さて、現状では、次のように定義された永続モデルがあります。
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Esqueletoを使用すると、CommitteetViewにデータを入力するクエリを簡単に作成できます。それはこのようなものになるでしょう:
getCommitteeView cid =
CommitteeView <$> runDB $
select $
from (person `InnerJoin` pxc `InnerJoin` committee) -> do
on (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
on (person ^. PersonId ==. pxc ^. CommitteePersonPersonId)
where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
return person
今、人口の問題を考えてみましょうCommitteesView
。原則として、上記のクエリでサブクエリを実行することで、入力するのに十分なデータを取得します。わかりました。group by
SQLのように「Group by Haskell-list」をどのように使用できますか?行を折り畳んで、人のリストのリストを作成するにはどうすればよいですか?
esqueleto
そのようにケースを処理できないという印象を受けます(つまり、それを行うコンビネーターがありません)。そして、基礎となるデータベースは明らかに列としてのHaskellリストをサポートしていません。しかし、確かに、この問題に直面するのは私だけではありません。効果的な戦略とは何ですか?リストのnリストをnリストに折りたたみますか?またはn+1
クエリを実行していますか?他のオプションはありますか?
Data.List.groupBy
?