gpt4 book ai didi

scala - 光滑的 3.0.0 : How to query one-to-many/many-to-many relations

转载 作者:行者123 更新时间:2023-12-03 13:36:32 26 4
gpt4 key购买 nike

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

例如,假设我们有三个表。 library , booklibrary_to_book图书馆有很多书。我想要的是一个图书馆的 list ,里面有他们的书。在 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])] 类型的结果反而?编写此类查询的“巧妙方式”是什么?

最佳答案

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

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

关于scala - 光滑的 3.0.0 : How to query one-to-many/many-to-many relations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30567365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com