2014-02-16 43 views
1

Slick 2.0中有沒有一種方法可以在表類上創建一個方法,該方法可以生成SQL JOIN語法而不僅僅是一個WHERE子句?在Slick 2.0中使用SQL JOIN語法而不是WHERE進行篩選

使用類似文件的例子:

class Suppliers(tag: Tag) extends Table[(Int, String)](tag, "SUPPLIER") { 
    ... 
    def suppliedCoffees = coffees.filter(_.supplierId == id) 
    def * = (id, name) 
} 

class Coffees(tag: Tag) extends Table[(Int, Int, String)](tag, "COFFEES") { 
    ... 
    def * = (id, supplierId, name) 
} 

我可以創建suppliedCoffees方法,並用它作爲這樣的:

for { 
    s <- suppliers 
    c <- s.suppliedCoffees 
} yield (s.name, c.name) ... 

尼斯和整潔 - 容易閱讀,並連接標準很好地隱藏起來。但是這會生成一個SQL WHERE子句。我怎麼能做類似於以下的事情,但使用像suppliedCoffees這樣的方法,以便它封裝在類中?

for { 
    (s, c) <- suppliers innerJoin coffees on (_.id === _.supplierId) 
} yield (s, c) ... 

或者更好的是,我該怎麼做一個外連接? (但作爲一種方法,如suppliedCoffees

for { 
    (s, c) <- suppliers leftJoin coffees on (_.id === _.supplierId) 
} yield (s.name, c.name.?) ... 

在此先感謝。

乾杯, Rob。

p.s.油滑真棒!它確實使得使用SQL數據庫的樂趣:)

回答

0

你可以讓他們的方法或功能。我們解釋瞭如何在我們的Scala Days 2013和Scala eXchange 2013會談中做到這一點。幻燈片和視頻可在此處獲得:http://slick.typesafe.com/docs/

+0

感謝您的回覆。所以我不得不使用隱式類?有沒有一種方法可以使它像我的示例中的'suppliedCoffees'方法一樣簡單(即,僅使用'filter') – headexplodes

+0

這看起來目前已經破裂。我添加了一個測試用例:'https:// github.com/slick/slick/pull/689'。爲什麼要在where語法上使用SQL連接語法? – cvogt

+0

這真的是一個很好的問題:)所以我可以做外部連接,併爲了與其他數據庫查詢的一致性,我猜。我假設在內連接的情況下,它會在大多數數據庫中執行與WHERE子句相同的操作。 Query(this).join ...是我以前的樣子(雖然我可能要等),而隱式類方法似乎也適用於我。謝謝你的幫助! – headexplodes