我的元组格式为 (DBIO[Seq[Person]], DBIO[Seq[Address]])
作为一对一的映射。Person
和 Address
是RDBMS中的独立表。配置文件的定义是 Profile(person: Person, address: Address)
. 现在我想把前者转换成 DBIO[Seq[Profile]]
. 以下是我如何得到的代码片段 (DBIO[Seq[Person]], DBIO[Seq[Address]])
for {
person <- personQuery if person.personId === personId
address <- addressQuery if address.addressId === profile.addressId
} yield (person.result, address.result)
需要帮助这种转变为 DBIO[Seq[Profile]
.
假设你不能使用连接,你需要用两个动作(两个 DBIO
s),你可以做的是将两个动作合二为一。
// Combine two actions into a single action
val pairs: DBIO[ ( Seq[Person], Seq[Address] ) ] =
(person.result).zip(address.result)
(zip
只是其中之一 多个组合体 你可以用它来操纵 DBIO
).
从那里您可以使用 DBIO.map
来将这对数据转换为你想要的数据基础设施。
比如说。
// Use Slick's DBIO.map to map the DBIO value into a sequence of profiles:
val profiles: DBIO[Seq[Profile]] = pairs.map { case (ppl, places) =>
// We now use a regular Scala `zip` on two sequences:
ppl.zip(places).map { case (person, place) => Profile(person, place) }
}
我对什么DBIO都不熟悉。假设它是某个类型T的case类 。
val (DBIO(people), DBIO(addresses)) = for {
person <- personQuery if person.personId === personId
address <- addressQuery if address.addressId === profile.addressId
} yield (person.result, address.result)
val profiles = DBIO(people.zip(addresses).map{ case (person, address) => Profile(person, address)})