2013-07-02 1 views
23

저는 Symfony2에 새로 입문했으며, QueryBuilder와 Doctrine 2를 통해 처음으로 성공적으로 만들었습니다. 아마 이것은 바보 같은 질문이지만 온라인과 Symfony2의 방법 모두에서 할 수 없었습니다. 조인 절 "WITH"와 "ON"의 차이점을 이해하기위한 항목을 찾으십시오. 예를 들어Symfony2 QueryBuilder가 ON과 WITH의 차이로 결합합니다.

이 내 가입 코드 :

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

그것은 잘 작동하지만 내가 대신 나는 다음과 같은 오류 얻을 WITHON를 넣을 경우 :

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

왜? 개체들 사이에서 T_ON과 T_WITH 같은 조인 절이 있지만 사용법의 차이점은 무엇입니까? 그들의 용도는 무엇입니까?

답변

41

@florian는 당신에게 정확한 답을하는 듯했으나 나를 예에 그것을 설명하려고하자 : SQL에서

는, 다음과 같이 수행 조인 :

다음

그것에 대해 관련 질문입니다 교리가 F를 알고 있기 때문에
SELECT * FROM category 
    LEFT JOIN product ON product.category_id = category.id 

(또는이 같은) 교리

지금, 당신은 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 허용하면 가입 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"의 이유와 차이점이 없기 때문입니다. –

관련 문제