Ответ 1
Второе левое соединение больше не работает на TableQuery[Titles]
, а вместо того, что эффективно Query[(Titles, Option[Volumes])]
(игнорируя параметры результата и типа коллекции). Когда вы присоедините результирующий запрос к вашему TableQuery[Chapters]
, вы можете получить доступ ко второй записи в кортеже, используя поле _2
(так как это Option
вам нужно map
получить доступ к полю uid
):
val q = for {
((t, v), c) <- titles
joinLeft volumes on (_.uid === _.titleUid)
joinLeft chapters on (_._2.map(_.uid) === _.volumeUid)
} yield /* etc. */
Избегание TupleN
Если синтаксис синтаксиса _N
неясен, вы также можете использовать способность Slick для пользовательских типов записей для сопоставления своих строк:
// The `Table` variant of the joined row representation
case class TitlesAndVolumesRow(title: Titles, volumes: Volumes)
// The DTO variant of the joined row representation
case class TitleAndVolumeRow(title: Title, volumes: Volume)
implicit object TitleAndVolumeShape
extends CaseClassShape(TitlesAndVolumesRow.tupled, TitleAndVolumeRow.tupled)