2011-09-25 3 views
3

모두. 도시와 POI가 2 개 있습니다. 매핑은 다음과 같습니다Doctrine2는 QueryBuilder에 의해 manyToMany 연관이있는 행을 페치합니다.

class City { 
/** 
* @ORM\ManyToMany(targetEntity="POI", mappedBy="cities") 
* @ORM\OrderBy({"position" = "ASC"}) 
*/ 
protected $pois; 

class POI { 
/** 
* @ORM\ManyToMany(targetEntity="City", inversedBy="pois") 
* @ORM\JoinTable(name="poi_cities") 
*/ 
protected $cities; 

내가 QueryBuilder 사용하여 일부 도시와 최소 1 관련이있는 모든 관심 장소를 가져올하고 싶습니다. 아마도 exist() 함수를 사용해야하지만 어떻게 조용하게하는지 알지 못합니다.

답변

6

당신은 Left join에 있고 cities가 null의 경우 확인 것입니다.

$qb->select('p', 'c') 
    ->from('AcmeDemoBundle:POI', 'p') 
    ->leftJoin('p.cities', 'c') 
    ->where('c IS NOT NULL'); 

나는 그것을 테스트하지 않은,하지만 난 당신에게 일반적인 방향을 제공 바랍니다. here에서 QueryBuilder에 대해 자세히 알아볼 수 있습니다.

+0

이 잘못된 네임 스페이스 분리기에서 제외 syntacically 올바른 ":" "\"(역 슬래시)이어야한다. 그러나, 아마도 더 빠르고 더 명확한 innerJoin은 leftJoin 대신에 where 절을 추가로 사용합니다. – Max

+0

@Max 필자는 분리 기호가 ":"이어야한다고 확신합니다. 실제로 innerJoin을 사용하는 것이 더 빠를 것입니다. 결과는 실제로 그룹화되어야합니다. ". 결과는 실제로뿐만 아니라 그룹화해야한다"그래에 의해 당신이 무슨 뜻인지 몰라,하지만) – gilden

+0

오, 당신이 구분에 대한 맞아, 심포니 2 태그를 간과. – Max

2

Docrine2은 2013 년 변경, ​​그래서 다른 솔루션은 우리가 사용하는 단지 조건 변수로 별명에 가입 할 수없는 지금 오류 Error: Cannot add having condition on a non result variable. 표시했다. 당신이 어떤 도시가없는 개체를 선택하려면 우리는 그래서 당신은

$qb->select('p', 'c') 
    ->from('AcmeDemoBundle:POI', 'p') 
    ->leftJoin('p.cities', 'c') 
    ->where('c.id IS NOT NULL'); 
$results = $qb->getQuery()->execute(); 

에 코드를 수정해야 c.id

같은 속성 중 하나를 사용해야 IS NULL를 사용합니다.

$qb->leftJoin('p.cities', 'city') 
    ->where('city.id IS NULL') 
    ->getQuery() 
    ->execute(); 

에 문제에 대한 설명과 링크를 커밋이 그에 대한 책임 - http://www.doctrine-project.org/jira/browse/DDC-2780