web-dev-qa-db-ja.com

滑らかな複数の結合

2つのテーブル間の結合は次のように行われます

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

最初の結合により、クエリはタプルを返します。タプルコンポーネントの1つに、2番目の結合に使用する外部キーがあります。フィールドを取得する前に、このコンポーネントを2番目の結合条件で取得する必要があります。 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 ... )
31
cvogt

私はあなたがこれが欲しいと思います:

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)

もちろん、私はあなたのモデルについて仮定しています。サプライヤーが企業またはコンピューターとリンクしているかどうかはわかりません。

3
pedrofurla