Veri türleri olarak tanımlanmış var:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Şimdi, olduğu gibi, Kalıcı bir modelim var:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Esqueleto kullanarak bir CommissionView doldurmak için kolayca bir sorgu oluşturabilirsiniz. Böyle bir şeye giderdi:
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
Şimdi, nüfus problemini düşünün CommitteesView
. Prensip olarak, yukarıdaki sorguda alt sorgu çalıştırarak doldurmak için yeterli veri alırız. Tamam, yeterince adil. Şimdi group by
SQL'de olduğu gibi "Group by Haskell-list" i nasıl kullanabilirim ? Bir kişi listesiyle sonuçlanabilmek için satırları nasıl katlayabilirim?
esqueleto
Davayı bu şekilde ele alamayacak izlenimi edindim (yani, bunu yapacak bir birleştirici yok). Temel veritabanım Haskell listelerini sütun olarak desteklemiyor. Ancak, elbette, bu sorunla karşılaşan tek kişi ben olamam. Etkili bir strateji nedir? Listelerin n listesini n listesine mi katlamak istiyorsunuz? Veya n+1
sorgular mı çalıştırıyorsunuz ? Başka seçenek var mı?
Data.List.groupBy
?