Scala slick:有条件地构建查询
Scala slick: build query conditionally
我是 Scala 的新手,我正在使用 Slick 3.1 并有以下查询:
val dBIOAction = for {
user <- users.filter(_.email === email)
company <- companies.filter(_.userid === user.id)
} yield (user, company)
并非所有用户都会在公司中有条目。尽管如此,我还是想 return 用户,即使公司中没有相应的条目。目前,如果没有进入公司,我得到空结果。
查询大致转换为:
res46: 字符串 = select x2."LASTNAME", x3."NAME", x2."FIRSTNAME", x3."WEBSITE", x3."USERID", x2."EMAIL", x2."ID", x3."ID" 来自 "Users" x2, "Companies" x3 其中 (x2."EMAIL" = 'a@a.com') 和 (x3."USERID" = x2."ID")
看起来总是包含公司条款 - 可以有条件地包含吗?如果没有,我还能如何达到预期的效果?
简单地使用 applicative join 而不是单子的(因为你想要 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)
我是 Scala 的新手,我正在使用 Slick 3.1 并有以下查询:
val dBIOAction = for {
user <- users.filter(_.email === email)
company <- companies.filter(_.userid === user.id)
} yield (user, company)
并非所有用户都会在公司中有条目。尽管如此,我还是想 return 用户,即使公司中没有相应的条目。目前,如果没有进入公司,我得到空结果。
查询大致转换为:
res46: 字符串 = select x2."LASTNAME", x3."NAME", x2."FIRSTNAME", x3."WEBSITE", x3."USERID", x2."EMAIL", x2."ID", x3."ID" 来自 "Users" x2, "Companies" x3 其中 (x2."EMAIL" = 'a@a.com') 和 (x3."USERID" = x2."ID")
看起来总是包含公司条款 - 可以有条件地包含吗?如果没有,我还能如何达到预期的效果?
简单地使用 applicative join 而不是单子的(因为你想要 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)