2013-08-30 16 views
19

Do łączenia dwóch tabel odbywa się jakstwardnienie łączy ze śliskiego

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

Jednak w przypadku jeśli przystępujące wymagane między kilku tabel, co jest właściwym sposobem próbuje poniżej, ale nie robi praca

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

Komputer jest kojarzony z dostawcą – dsr301

Odpowiedz

28

Pierwszy dołącz do wyników w zapytaniach zwrotnych krotkach. Jeden z komponentów krotki ma klucz obcy, którego chcesz użyć do drugiego sprzężenia. Musisz zdobyć ten komponent w drugim warunku łączenia przed uzyskaniem jego pola. Jeśli firmy znajduje się tabela, która ma pole suppId to będzie wyglądać następująco:

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

tutaj leftJoin Dostawcy na (_._ 2.suppId === _.id) to jest połączenie na pierwszej krotce? w przypadku, jeśli chcę dołączyć do komputera i dostawców próbuję z dostawcami LeftJoin na (_._ 1.suppId === _.id), ale ten się nie powiedzie – dsr301

+0

To działa, ale widzę, że pełne zapytanie z łączeniami powinno być w jedna linia, w przeciwnym razie błędy w kompilacji pokazu – dsr301

+0

zmieniły odpowiedź na jedną linię – cvogt

5

Myślę, że chcesz to:

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) 

Oczywiście, robię założenia dotyczące modelu. Nie wiem, czy dostawcy są powiązani z firmami lub komputerami.

+2

Podoba mi się, że drugie sprzężenie jest osobną linią w rozumieniu "dla". –

+0

W jaki sposób firma łączy się wewnętrznie? To jest typ modelu? (druga linia w pętli for) – Setheron

+0

'company' jest tą określoną w poprzednim wierszu. – pedrofurla