Подтвердить что ты не робот

Множественные соединения с пятнами

Для соединения между двумя таблицами выполняется как

    (for {
    (computer, company) <- Computers leftJoin Companies on (_.companyId === _.id)
    if computer.name.toLowerCase like filter.toLowerCase()
    }

Но в случае, если требуется соединение между большим количеством таблиц, что нужно делать правильно, но не работает

   (for {
    (computer, company,suppliers) <- Computers leftJoin Companies on (_.companyId ===        _.id)
     //not right leftjoin Suppliers on (_.suppId === _.id)
    if computer.name.toLowerCase like filter.toLowerCase()
  }
4b9b3361

Ответ 1

Первое соединение приводит к возврату Tuples. Один из компонентов кортежа имеет внешний ключ, который вы хотите использовать для второго соединения. Вам нужно получить этот компонент во втором состоянии соединения, прежде чем получить его поле. Если компании являются таблицей, которая имеет поле suppId, она будет выглядеть так:

(for {
  ((computer, company),suppliers) <- Computers leftJoin Companies on (_.companyId === _.id) leftJoin Suppliers on (_._2.suppId === _.id)
  if computer.name.toLowerCase like filter.toLowerCase()
} yield ... )

Ответ 2

Я думаю, вы этого хотите:

for {
    (computer, company) <- Computers leftJoin Companies on (_.companyId === _.id)
    (supp, _) <- company innerJoin Suppliers on (_.suppId === _.id)
    if computer.name.toLowerCase like filter.toLowerCase()
} yield (computer, company, supp)

Конечно, я делаю предположения относительно вашей модели. Не уверены, связаны ли поставщики с компаниями или компьютерами.