1

Using documentation in Slick 3.1.0 as source for classes :

   implicit class PersonExtensions[C[_]](q: Query[People, Person, C]) {
      def withAddress = q.join(addresses).on(_.addressId === _.id)
      def withContact = q.join(contacts).on(_.contactId === _.id)
   }

I would like to be able to do something like this :

   val chrisQuery = people.filter(_.id === 2)

   val chrisWithAddressWithContact: Future[((Person, Address), Contact)] =
     db.run(chrisQuery.withAddress.withContact.result.head)
   val chrisWithContactWithAddress: Future[((Person, Contact), Address)] =
     db.run(chrisQuery.withContact.withAddress.result.head)
Thomas Pocreau
  • 470
  • 5
  • 12

1 Answers1

0

You can compose queries with zip.

val q1: Query[Xs, X, Seq]
val q2: Query[Ys, Y, Seq]
val query: Query[(Xs, Ys), (X, Y), Seq] = q1 zip q2
val results: DBIO[Seq[(X, Y)]] = query.result
val result: DBIO[(X, Y)] = results.head
db.run(result).map { case (r1: X, r2: Y) => ...}

Of course you can omit types and inline everything :)

Doc: http://slick.typesafe.com/doc/3.0.0/queries.html#zip-joins

Anna Zubenko
  • 1,645
  • 2
  • 11
  • 12