Slick 3.0.0: How to query one-to-many / many-to-many relations

前端 未结 2 1006
广开言路
广开言路 2020-12-29 07:00

Basically the same question has been asked about a year ago for slick 2.x (scala slick one-to-many collections). I\'m wondering if there has any progression been made with t

相关标签:
2条回答
  • 2020-12-29 07:45

    IMO your code looks fine. It really depends on what feels more readable to you. Alternatively, you can use join as well:

    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)
    

    You can then do a groupBy on a particular key to get the kind of data structure you are looking for. In this case, it would be more evolved as it is join across three tables. Example, add following to your query:

    val findBooksQuery = libraries
      .join(libraryToBooks).on(_.id === _.libraryId)
      .join(books).on(_.id === _._2.bookId)
      // To group by libraries.id
      .groupBy(_._1.id)
      .result
    
    0 讨论(0)
  • 2020-12-29 08:00

    To what you want to map to, db.run returns a Future(of something), a Future[Seq[(Library, Seq[Book])]] in your case. When mapping over a future you have access to the Seq and you can transform it to something else to get a new Future.

    0 讨论(0)
提交回复
热议问题