из документации Slick, ясно, как сделать одно левое соединение между двумя таблицами.
val q = for {
(t, v) <- titles joinLeft volumes on (_.uid === _.titleUid)
} yield (t, v)
Запрос q будет, как и ожидалось, иметь атрибуты: _1
типа Titles
и _2
типа Rep[Option[Volumes]]
для покрытия несуществующих томов.
Дальнейшее каскадирование проблематично:
val q = for {
((t, v), c) <- titles
joinLeft volumes on (_.uid === _.titleUid)
joinLeft chapters on (_._2.uid === _.volumeUid)
} yield /* etc. */
Это не сработает, потому что _._2.uid === _.volumeUid
недействителен, если _.uid
не существует.
Согласно различным источникам в сети, это не должно быть проблемой, но, опять же, источники, как правило, нацелены на разные версии slick, а 3.0 все еще довольно новые. У кого-нибудь есть ключ к этой проблеме? Чтобы пояснить, идея состоит в том, чтобы использовать два левых соединения для извлечения данных из 3 каскадных таблиц 1: n: n. Эквивалентным SQL будет:
Select *
from titles
left join volumes
on titles.uid = volumes.title_uid
left join chapters
on volumes.uid = chapters.volume_uid