2013-07-02 34 views
23

我是新來的Symfony2,並且我通過QueryBuilder和Doctrine 2成功建立了我的第一個連接。 也許這是一個愚蠢的問題,但是在線和Symfony2的方法中我都無法找到任何理解連接子句「WITH」和「ON」之間區別的內容。Symfony2 QueryBuilder加入ON和WITH區別

例如,這是我加入代碼:

->leftJoin('EcommerceProductBundle:ProductData', 'pdata', 'WITH', 'prod.id = IDENTITY(pdata.product)') 

它的工作不錯,但如果我把ON,而不是WITH我得到以下錯誤:

[Syntax Error] line 0, col 200: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'

爲什麼?我在對象中看到T_ON和T_WITH都像連接子句一樣,但是它們的用法不同呢?他們的用途是什麼樣的?

回答

41

@florian給你正確的答案,但讓我嘗試解釋它例如:

在SQL中,接縫是這樣完成的:

SELECT * FROM category 
    LEFT JOIN product ON product.category_id = category.id 

(或像這樣)的教義現在

,你並不需要使用ON子句,因爲教義知道使f ROM實體中的關係註釋。因此上面的例子是:

// CategoryRepository.php 
public function getCategoriesAndJoinProducts() 
{ 
    return $this->createQueryBuilder("o") 
     ->leftJoin("o.products", "p")->addSelect("p") 
     ->getQuery()->getResult() ; 
} 

兩者都會獲取所有類別並加入與其關聯的產品。

現在來到WITH條款。如果你想加入只有產品價格比50大,你會在SQL做到這一點:

SELECT * FROM category 
    LEFT JOIN product ON product.category_id = category.id AND product.price>50 

教義:

// CategoryRepository.php 
public function getCategoriesAndJoinProductsWithPriceBiggerThan($price) 
{ 
    return $this->createQueryBuilder("o") 
     ->leftJoin("o.products", "p", "WITH", "p.price>:price") 
      ->setParameter("price", price)->addSelect("p") 
     ->getQuery()->getResult() ; 
} 

所以,在現實中,你應該永遠,永遠,如果你使用ON正在使用教義。如果你需要這樣的事情,你幾乎可以肯定你搞砸了別的東西。

+0

和結果呢?做它返回相關的實體\模型?例如我不能得到正確的一個http://stackoverflow.com/questions/20134014/symfony2-doctrine2-left-join-dql-and-its-result – user1954544

6

理論上,ON允許您給出完整的聯接標準,而WITH允許將其他標準添加到默認聯接標準(恕我直言)。

但是,什麼DQL許可證是爲了避免給JOIN標準:

你只需要說:$qb->leftJoin('prod.pdata', 'pdata');

而且doctrine2將處理正確連接。

這是關於一個相關的問題:Can I use "ON" keyword in DQL or do I need to use Native Query?

+0

非常感謝評論。 我已經看到這篇文章,我的問題是,它不能滿足我的問題,因爲那裏,只寫瞭解決方案,而不是「WITH」而不是「OR」及其差異的原因。 –

相關問題