2016-04-05 15 views
6

Próbuję wykonać wiele złączeń w wersji Slick 3.1.1. Wynik, który chciałbym osiągnąć to:Scala Slick 3.1 wiele dołączeń

SELECT * FROM customer LEFT JOIN customer_address ON customer.id = customer_address.customer_id LEFT JOIN address ON customer_address.address_id = address.id 

Próbowałem następujące:

val query = for { 
    c <- Customer 
    ca <- CustomerAddress if ca.customerId === c.id 
    a <- Address if a.id === ca.addressId 
} yield (c, a) 

Problem polega na tym, że jeśli klient nie posiada adresu, który nie robi pojawiają się, co ma sens.

Potem próbowałem to:

val query2 = for { 
     (c, ca, a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id) 
    } yield (c, a) 

Problem polega na tym, że pojawia się błąd na _._2.addressId ponieważ _._2 jest Rep przedmiot.

Dokładny błąd:

Error:(21, 110) value addressId is not a member of slick.lifted.Rep[Option[Models.Tables.CustomerAddress]] 
    (c, ca, a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id) 

Auto generowane Slick klasę tabelach: http://pastebin.com/e4M3cGU8

Jak mogę uzyskać wyniki, które chcę z Slick?

+0

Czy możesz dodać błąd, który otrzymałeś? –

Odpowiedz

3

Co trzeba zrobić, to także odwzorowanie wyników.

val query2 = for { 
     ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.map(_.addressId) === _.id) 
} yield (c, a) 
+0

to jest właściwa odpowiedź, ale ta składnia jest mdląca. Myślałem, że gładko rozwiązałbym problemy, ale spotkałem się z takimi frustracjami –

1

To powinno zadziałać. // ((c, ca), a) zamiast (c, ca, a)

val query2 = for { 
    ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id) 
} yield (c, a) 
+0

Próbowałem, ale nadal daje ten sam błąd –

+0

@JellevanEs Wygląda na to, że konfiguracja dla 'Table' jest niepoprawna. Czy możliwe byłoby współdzielenie definicji "Klient", "CustomerAddress" i "Address"? Wygląda na to, że opuściłeś opcję 'Option' w jednej z definicji tabeli? – TheKojuEffect

+0

Dodałem klasę tabeli. Nie wiem, czy możesz coś z tym zrobić, ponieważ jest generowany automatycznie przez śliskie –

Powiązane problemy