2016-04-05 17 views
6

Sto tentando di eseguire più join in Slick 3.1.1. Il risultato che vorrei realizzare è questo:Scala Slick 3.1 join multipli

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

Ho provato quanto segue:

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

Il problema qui è che se un cliente non ha un indirizzo che non è così apparire che abbia un senso

Poi ho provato questo:

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

Il problema qui è che ottengo un errore su _._2.addressId perché _._2 è un oggetto Rep.

errore esatto:

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 generato Slick classe Tavoli: http://pastebin.com/e4M3cGU8

Come posso ottenere i risultati che voglio con Slick?

+0

Puoi aggiungere l'errore che ricevi? –

risposta

3

Quello che devi fare è anche mappare i risultati.

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

questa è la risposta giusta ma questa sintassi è nauseante. Pensavo che la chiazza di petrolio avrebbe risolto i problemi per me, ma mi hanno appena incontrato delle frustrazioni come questa –

1

Questo dovrebbe funzionare. // ((c, ca), a) invece di (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

L'ho provato ma continua a dare lo stesso errore –

+0

@JellevanEs Sembra che la configurazione di 'Table' sia errata. Sarebbe possibile condividere la definizione di 'Cliente',' CustomerAddress' e 'Indirizzo'? Sembra che tu abbia perso l'uso di 'Opzione' in una di quelle definizioni di tabella? – TheKojuEffect

+0

Ho aggiunto la classe Tabella. Non so se si può fare qualcosa perché è generato automaticamente da slick –

Problemi correlati