2013-09-04 3 views
5

ich eine Beispielabfrage mit Slick habe wie folgt:wollen mit besserem Weg, wissen, von Verbindungstabellen Slick

val query = 
    (for { 
    (company,loc) <- Company leftJoin Location on (_.locId === _.id) 
    (_,typeof) <- Company leftJoin Types on (_.typeId === _.id) 
    } yield (company, loc, typeof)) 

ist ein besserer Weg, um mehr Verknüpfungen zu tun?

Ich habe die Vorschläge in multiple joins with slick versucht, aber in Fehlern resultiert.

+0

Was meinst du mit besseren Weg? Was ist daran schlimm? –

+0

Ich sah die Abfrage erzeugt es mehrere Abfragen auf der gleichen Tabelle Firma zweimal erzeugt und Beitritt einmal mit Standort und einmal mit Typ. Normalerweise geschieht dies mit sql in einer Abfrage mit mehreren Joins. Willst du wissen, ob da etwas nicht stimmt? – dsr301

Antwort

4

Dies funktioniert gut.

for { 
    ((company,geo),typeof) <- Company 
     leftJoin Location on (_.locId === _.id) 
     leftJoin Business_Levels on (_._1.typeId === _.id) 
} 
+0

Dies beantwortet Ihre Frage, oder? Bitte kennzeichnen Sie es als die Antwort in diesem Fall :). Danke – cvogt

2

Sie können Kette die Verbindung normalerweise:

for { 
    (company, location, type) <- Company 
     leftJoin Location on (_.locId === _.id) 
     leftJoin Types on (_._1.typeId === _.id) 
} yield (company, location, type) 

Und übrigens, ich bin ziemlich sicher, dass das Wort type ein scala reserviertes Wort ist.

EDIT: hinzugefügt die _.1 in Zeile 3 nach dsr301 Kommentar.

+0

yep, type ist keyword, Post hat aus einigen Gründen keine ursprünglichen Namen. irgendwie hat es sich geändert. Es gibt mir Kompilierungsfehler mit dem, was Sie oben erwähnten. ')' erwartet aber '.' gefunden. at (_.typeId === _.id) – dsr301

+0

Nach dem Ändern der vollständigen Abfrage auf einen einzigen Fehler "typeId ist kein Mitglied von (models.company.type, models.Location.type)". Ich denke für den zweiten Join wird auf das Tupel durchgeführt, das vom ersten Join generiert wurde – dsr301

+0

Edited meine Antwort. –