2016-09-22 5 views
0

Ich bin neu in Scala und ich bin mit Slick 3.1 und haben diese Abfrage:Scala Slick: bauen Abfrage bedingt

val dBIOAction = for { 
    user <- users.filter(_.email === email) 
    company <- companies.filter(_.userid === user.id) 
} yield (user, company) 

Nicht alle Benutzer haben Einträge in Unternehmen. Dennoch möchte ich Benutzer zurückgeben, auch wenn es keinen entsprechenden Eintrag in der Firma gibt. Derzeit, wenn kein Eintrag in der Firma, bekomme ich leere Ergebnis.

Abfrage übersetzt in etwa:

res46: String = select x2 "ZUNAME" x3 "NAME", x2 "VORNAME" x3 "Website", x3 "USERID", x2...... "EMAIL", x2. "ID", x3. "ID" von "Benutzer" x2, "Firmen" x3, wobei (x2. "EMAIL" = '[email protected]') und (x3. "USERID" = x2 . "ID")

Sieht aus wie Firmenklausel ist immer enthalten - kann das bedingt enthalten sein? Wenn nicht, wie kann ich sonst den gewünschten Effekt erzielen?

Antwort

3

Verwenden Sie einfach einen applicative join eher als ein monadischen ein (da Sie eine LEFT JOIN wollen, anstatt eine INNER JOIN:

val usersWithCompany = users.joinLeft(companies).on(_.id === _.userId) 
val dBIOAction = for { 
    (user, company) <- usersWithCompany.filter(_._1.email === email) 
} yield (user, company) 
+0

nahtlos gearbeitet! – srvy