Как повторно использовать Slick Relationships в кортеже?

Использование документации в Slick 3.1.0 в качестве источника для занятий:

   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)
   }

Я хотел бы иметь возможность сделать что-то вроде этого:

   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)

person Thomas Pocreau    schedule 05.11.2015    source источник


Ответы (1)


Вы можете составлять запросы с помощью 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) => ...}

Конечно, вы можете опустить типы и встроить все :)

Документ: http://slick.typesafe.com/doc/3.0.0/queries.html#zip-joins

person Anna Zubenko    schedule 06.11.2015