2012-10-30 2 views
0

와 연관 테이블을 통해 원격 테이블의 ID를 가져 오기 위해 나는이 두 테이블 foobar 및 다음과 같은 모델 사이에서 foo_has_bar 협회 : 내가 얻으려고방법 Doctrine2 DQL

enter image description here

, 주어진 foo.id에 해당하는 모든 bar.id이 이에 해당합니다. 다음과 같이

는 지금까지 특정 foo.id 관련 foo_has_bar에서 모든 항목을 검색 할 수 있었다 :

$query = $em->createQuery("SELECT h FROM 'FooHasBar' h INNER JOIN h.foo f WHERE f.id = ?1"); 
$query->setParameter(1, $foo_id); 
$results = $query->getArrayResult(); 

문제는 $results 만, foo_has_bar 아니 외래 키 foo_idid 필드가 포함되어 있다는 것입니다 그리고 bar_id, 그리고 나는 내가 원하는 것을 성취 할 수 없다.

특정이 하나의 DQL 명령으로 모든 해당 bar.id을 검색하는 방법이 있습니까?

답변

1

엔티티 FooHasBar 가정 각각 foobar의 관계가 FooBar 인 경우 쿼리는 매우 간단합니다.

$q = $em->createQuery(
    'SELECT 
     b.id as bar_id, f.id as foo_id 
    FROM FooHasBar fb 
    JOIN fb.bar b 
    JOIN fb.foo f 
    WHERE f.id = :fooId' 
); 
$q->setParameter('fooId', $foo->getId()); 

$results = $query->getArrayResult(); 
+1

그것은 승자입니다 :) – Max

0

엔티티 사이의 연결이 양방향 경우 :

$q = $em->createQuery('SELECT b.id FROM Bar b JOIN b.fooHasBar x WHERE x.foo = :fooId'); 
$q->setParameter('fooId', $foo->getId()); 

$results = $query->getScalarResult(); 

엔티티 사이의 연결이 단방향 인 경우 (교리에만 이렇게 2.3) :

$q = $em->createQuery('SELECT b.id FROM Bar b JOIN FooHasBar x WITH x.bar = b.id WHERE x.foo = :fooId'); 
$q->setParameter('fooId', $foo->getId()); 

$results = $query->getScalarResult(); 
+1

감사하지만 둘 다 나를 위해 실패합니다. 'Class Bar는 fooHasBar라는 이름의 연관 관계가 없습니다. '라고 생각합니다. 두 번째는'Join Path expression에 사용되었지만 정의되지 않은 Identification Variable FooHasBar '로 실패하고' Joo FooHasBar x'. 어떤 아이디어가이 작품을 만드는 방법? – Max

+0

@ 재스퍼 그는 거기에'ManyToMany' 협회가 없습니다 ... 그것은 질문 btw에서 혼란 스러웠습니다. – Ocramius

+0

ManyToOne/OneToMany 연관이 있다고 가정하고 엔티티/속성의 이름이 테이블/열 (camelcased)과 같은 것으로 가정합니다. @ user359650 : 엔티티 코드 (관련 부분)를 제공 할 수 있습니까? –