【问题标题】:multiple joins with slick光滑的多个连接
【发布时间】:2013-09-03 11:30:25
【问题描述】:

两个表之间的连接是这样的

    (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()
  }

【问题讨论】:

  • 计算机与供应商关联

标签: scala slick


【解决方案1】:

第一次连接导致查询返回元组。元组组件之一具有您要用于第二个连接的外键。在获取其字段之前,您需要在第二个连接条件中获取此组件。如果 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 ... )

【讨论】:

  • here leftJoin Suppliers on (._2.suppId === _.id) 是在第一个元组上加入吗?如果想在计算机和供应商之间加入我正在尝试使用 leftJoin Suppliers on (._1.suppId === _.id) 但这个失败
  • 这行得通,但我看到带有连接的完整查询应该在一行中,否则它会显示编译错误
  • 将答案改为一行
【解决方案2】:

我想你想要这个:

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)

当然,我正在对您的模型做出假设。不确定供应商是否与公司或计算机相关联。

【讨论】:

  • 我喜欢第二个连接是“for”理解中的单独一行。
  • 这里公司是怎么做内联的?它是模型类型吗? (for循环中的第二行)
  • company 是上一行中定义的。
  • 因为您不能将company 用作查询,所以它是一个投影。我在 Slick 2.1 上测试了这个解决方案 3 次:p
  • 看问题的日期和答案的日期。无论如何,如果我有时间,我会修改问题。
猜你喜欢
  • 1970-01-01
  • 2013-03-10
  • 2015-01-05
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
相关资源
最近更新 更多