这里已经有一个关于数组聚合的话题:
在 scala 框架中支持 PostgreSQL 特定的 array_agg 函数?
但是,由于它目前不受支持,我发现很难用 slick 做一些事情。这是一个简单的例子。
例如,我经营一家举办派对的企业。每个聚会都有客人,主人:
Party(id: Option[Int], name: String)
Guest(id: Option[Int], name: String)
Host(id: Option[Int], name: String)
PartyGuests(partyId, guestId: Int)
PartyHosts(partyId, hostId: Int)
我想要一张所有派对的桌子,显示所有客人和主人,如下所示:
PartyId |客人 |主持人 ------------|------------------------|------ 1 |亚当、朱莉、杰克 |汤姆、杰米、约翰 2 |乔、吉姆、杰克 |汤姆、托尼、詹姆斯 3 |艾米,莎莉 |珍妮
我的解决方案是这样的:
// The map is: partyId -> (guestNamesList, hostNamesList)
val partyTable: Map[Int, (List[String], List[String])] = (for {
party <- db.run(parties.result.list)
guest <- db.run(partyGuests
.filter(_.partyId === party.id)
.flatMap(_.guest)
.result.list)
host <- db.run(partyHosts
.filter(_.partyId === party.id)
.flatMap(_.host)
.result.list)
} yield (party, guest, host))
.groupBy { case (party, guest, host) =>
party.id
}
.mapValues { values =>
val myGuests = values.map(_._2).distinct.map(_.name)
val myHosts = values.map(_._3).distinct.map(_.name)
(myGuests, myHosts)
}
然而,这种解决方案在大型数据集上非常占用空间。有谁知道更好的解决方案?