2016-04-05 7 views
6

Slick 3.1.1で複数の結合を実行しようとしています。私は次のことを試してみましたScala Slick 3.1複数の結合

SELECT * FROM customer LEFT JOIN customer_address ON customer.id = customer_address.customer_id LEFT JOIN address ON customer_address.address_id = address.id 

val query = for { 
    c <- Customer 
    ca <- CustomerAddress if ca.customerId === c.id 
    a <- Address if a.id === ca.addressId 
} yield (c, a) 

ここでの問題は、顧客はそれがないアドレスを持っていない場合ということで、私が達成したい結果がこれですそれは意味をなさない。

は、その後、私はこれを試してみました:

val query2 = for { 
     (c, ca, a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id) 
    } yield (c, a) 

ここでの問題は_._2Repオブジェクトであるので、私は_._2.addressId上のエラーを取得していることです。

正確なエラー:

Error:(21, 110) value addressId is not a member of slick.lifted.Rep[Option[Models.Tables.CustomerAddress]] 
    (c, ca, a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id) 

自動スリックテーブルクラスを生成: http://pastebin.com/e4M3cGU8

をどのように私はスリックで望む結果を得ることができますか?

+0

エラーを追加してください。 –

答えて

3

の// ((c, ca), a)

val query2 = for { 
     ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.map(_.addressId) === _.id) 
} yield (c, a) 
+0

これは正しい答えですが、この構文は吐き気です。私はスリックが私のために問題を解決するだろうと思ったが、私はちょうどこのような不満で会われた –

1

これは動作するはずです。代わりに、あなたはまた、結果をマッピングされなければならない何(c, ca, a)

val query2 = for { 
    ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id) 
} yield (c, a) 
+0

私は試しましたが、それでも同じエラーが発生します –

+0

@JellevanEs 'Table'の設定が間違っているようです。 'Customer'と' CustomerAddress'と 'Address'定義を共有することは可能でしょうか?これらのテーブル定義のうちの一つで 'Option'を使うのを見逃してしまったように見えますか? – TheKojuEffect

+0

私は、テーブルクラスを追加しました。私は滑らかに自動生成されているので、あなたが何かをすることができるか分からない –