使用Slick进行多表连接

21

连接两个表的方法如下:

    (for {
    (computer, company) <- Computers leftJoin Companies on (_.companyId === _.id)
    if computer.name.toLowerCase like filter.toLowerCase()
    }

但是如果需要在更多的表之间进行连接,尝试以下方法不起作用

   (for {
    (computer, company,suppliers) <- Computers leftJoin Companies on (_.companyId ===        _.id)
     //not right leftjoin Suppliers on (_.suppId === _.id)
    if computer.name.toLowerCase like filter.toLowerCase()
  }

计算机与供应商相关联。 - dsr301
2个回答

36

第一个连接会返回元组的查询结果。其中一个元组组成部分具有您希望用于第二个连接的外键。在获取其字段之前,您需要在第二个连接条件中获取此组件。如果Companies是具有suppId字段的表,则应该如下所示:

(for {
  ((computer, company),suppliers) <- Computers leftJoin Companies on (_.companyId === _.id) leftJoin Suppliers on (_._2.suppId === _.id)
  if computer.name.toLowerCase like filter.toLowerCase()
} yield ... )

左连接 Suppliers on (_._2.suppId === .id) 这个是在第一个元组上进行的连接吗?如果想要在计算机和供应商之间进行连接,我尝试使用 leftJoin Suppliers on (._1.suppId === _.id),但这个连接失败了。 - dsr301
这个可以运行,但我发现带连接的完整查询语句应该在一行中,否则它会显示编译错误。 - dsr301
将答案改为一行。 - cvogt

4
我认为你需要这个:

我认为您需要以下内容:

for {
    (computer, company) <- Computers leftJoin Companies on (_.companyId === _.id)
    (supp, _) <- company innerJoin Suppliers on (_.suppId === _.id)
    if computer.name.toLowerCase like filter.toLowerCase()
} yield (computer, company, supp)

当然,我对你的模型作出了一些假设。不确定供应商是否与公司或计算机相关联。

2
我喜欢第二个连接在“for”推导式中是单独一行的。 - Eric Pabst
公司在这里如何执行内连接?这是一种模型类型吗?(循环中的第二行) - Setheron
company 是在前一行中定义的。 - pedrofurla
4
因为company不能用作查询,所以它是一个Projection。我在Slick 2.1上测试了这个解决方案3次。 :p - AlixB
1
看一下问题的日期和回答的日期。无论如何,如果我有时间,我会修改这个问题。 - pedrofurla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接