Scala slick:有条件地构建查询

时间:2016-09-22 04:59:24

标签: scala slick

我是Scala的新手,我使用的是Slick 3.1并且有这个查询:

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

并非所有用户都会在公司中有条目。尽管如此,即使公司中没有相应的条目,我仍希望返回用户。目前,如果没有公司参赛,我会得到空的结果。

查询粗略转换为:

res46:String =选择x2。“LASTNAME”,x3。“NAME”,x2。“FIRSTNAME”,x3。“网站”,x3。“USERID”,x2。“EMAIL”,x2。“ID”, x3。“用户”x2中的“ID”,“公司”x3,其中(x2。“EMAIL”='a@a.com')和(x3。“USERID”= x2。“ID”)

看起来总是包含公司条款 - 可以有条件地包括在内吗?如果没有,我怎么能达到预期的效果呢?

1 个答案:

答案 0 :(得分:4)

只需使用applicative join而不是monadic(因为您需要LEFT JOIN而不是INNER JOIN

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