20

大约一年前,对于 slick 2.x ( scala slick one-to-many collections ),基本上也有人问过同样的问题。我想知道反应性浮油的发布是否有任何进展。

例如,假设我们有三个表。librarybook并且library_to_book图书馆有很多书。我想要的是一个图书馆的清单,里面有他们的书。在 scala 中,这类似于Seq[(Library, Seq[Book])]. 我的查询如下:

val q = (for {
  l   <- libraries
  ltb <- libraryToBooks if l.id === ltb.libraryId
  b   <- books if ltb.bookId === b.id
} yield (l, b)
db.run(q.result).map( result => ??? )

results在这种情况下是类型Seq[(Library, Book)]。我如何必须更改我的查询才能获得类型的结果Seq[(Library, Seq[Book])]?编写此类查询的“巧妙方式”是什么?

4

2 回答 2

8

IMO 你的代码看起来不错。这真的取决于你觉得什么更具可读性。或者,您也可以使用join

val findBooksQuery = libraries
  .join(libraryToBooks).on(_.id === _.libraryId)
  .join(books).on(_.id === _._2.bookId)
  .result

val action = (for {
  booksResult <- findBooksQuery
} yield {
  booksResult.map { row =>
    val (libraryTableRow, libraryToBooksTableRow) = row._1
    val booksTableRow = row._2
    // TODO: Access all data from the rows and construct desired DS
  }
}

db.run(action)

然后,您可以对特定键执行 groupBy 以获得您正在寻找的数据结构。在这种情况下,它会更加进化,因为它是跨三个表连接的。例如,将以下内容添加到您的查询中:

val findBooksQuery = libraries
  .join(libraryToBooks).on(_.id === _.libraryId)
  .join(books).on(_.id === _._2.bookId)
  // To group by libraries.id
  .groupBy(_._1.id)
  .result
于 2015-06-12T19:51:44.220 回答
0

对于您想要映射到的内容,db.run 在您的情况下返回一个 Future(of something),一个 Future[Seq[(Library, Seq[Book])]]。在映射未来时,您可以访问 Seq,并且可以将其转换为其他东西以获得新的未来。

于 2015-06-01T11:45:14.323 回答