2013-07-02 4 views
23

私はSymfony2の新機能です.QuickBuilderと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 

(またはこのようなもの)

教義は、そのFを知っているので、今教義では、あなたはON句を使用する必要はありませんあなたのエンティティのrom関係注釈。したがって、上記の例は次のようになります:

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

両方とも、すべてのカテゴリを取得し、それらに関連付けられた製品を結合します。

今やWITHという句があります。教義で

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

:あなたは50より大きい価格で製品のみに参加したい場合は、SQLでこれを行うだろうあなたがいる場合

// 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を使用しないでくださいDoctrineを使用しています。そういうものが必要な場合は、あなたが何か他のものを犯したことをほぼ確実に確信することができます。

+0

と結果はどうですか?それは関連するエンティティ\モデルを返しますか?例えば、私は適切なものを得ることができないhttp://stackoverflow.com/questions/20134014/symfony2-doctrine2-left-join-dql-and-its-result – user1954544

6

理論上、ONは完全結合基準を与えることを許可し、WITHはデフォルト基準(IMHO)に追加の基準を追加することを許可します。

はしかし、どのようなDQL許可することは、JOINのcriteriasを与えないようにすることです:

あなただけ言っている:$qb->leftJoin('prod.pdata', 'pdata');

そしてdoctrine2が正常に参加処理します。ここで

はそのことについて、関連する質問です:Can I use "ON" keyword in DQL or do I need to use Native Query?

+0

コメントありがとうございました。 私はすでにその投稿を見ていて、私の問題は、そこには解決策が書かれているに過ぎず、 "OR"の代わりに "WITH"の理由とその違いが書かれているためです。 –

関連する問題