2014-12-09 5 views
0

DB에 OneToMany 관계가있는 두 개의 테이블이 있습니다. 'EntityRepository'에서 'createQueryBuilder()'메서드를 사용하면 조건이있는 일부 객체를 선택하려고합니다. 나의 방법이있다 :Symfony 2 OneToMany 관계 - 연관성이 잘못됨

$query = $this->getEntityManager()->createQueryBuilder(); 
    $query->select("parent") 
     ->from('TestAppBundle:Parent', 'parent') 
     ->leftJoin("parent.children", 'child', 'WITH', 'child.IdP = parent.id') 
     ->where('child.date < :date') 
     ->andWhere('child.status = :null') 
     ->setParameter('date', new DateTime()) 
     ->setParameter('null', 0); 

그리고 그것은 거의 잘 작동한다. 나는 ArrayCollections에있는 Children Objects를 가진 Parent Objects를 얻는다. 방법은 조건이있는 부모 개체를 선택하지만 문제는 조건을 유지하지 않는 어린이 개체를 얻는 것입니다. 조건을 유지하는 부모 개체와 상태를 유지하는 자식 개체 만 가져오고 싶습니다. 이때 쿼리 후 결과를 필터링하고 Children 객체를 수동으로 제거해야합니다. 는 당신이 문제 :

+0

선택한 자녀가 충족시키지 못하는 조건은 무엇입니까? – Jeroen

+0

자녀는 필드 이름이 'status'입니다. 이 필드는 true 또는 false 일 수 있습니다. 나는 자녀가 상태가 false 인이 부모만을 선택하려고합니다. 즉 8000 행에서 작동합니다. 부모 개체는 100 개가되지만 어린이를 보려면 상태가 true 인 자식과 상태 false 인 자식을 얻습니다. 쿼리 후 상태가 true 인 Child 개체를 제거해야합니다. – semafor

답변

0

을위한거야 게으른 부하 모든 어린이 getChildren()을 호출하면 부모. 이 같은 두 어린이와 부모가 게으른 로딩을 방지하기 위해 선택

$query->select("parent, child") 

자세한 내용은 my answer to a similar question를 참조하십시오.

+0

고마워요! 나는 전에 이런 방법을 시도했지만, 나는 부모와 자식 (한 수준의 배열에 두 가지 유형의 객체)이 혼합 된 값을 가진 컬렉션을 가지고 있다고 생각했습니다. 그것은 사실이 아니었다. – semafor

0

당신이 이런 식으로 뭔가를 시도 할 수 이해 바랍니다 : 당신이 질의 시간에 엔티티를 선택하지 않는 경우, 기본적으로

$query = $this->getEntityManager()->createQueryBuilder(); 
$query->select("parent") 
    ->from('TestAppBundle:Parent', 'parent') 
    ->leftJoin("parent.children", 'child', 'WITH', 'child.status = 0'); 
+0

불행히도 아무 것도 변경되지 않습니다. 나는 아직도 많은 자식 개체를 가지고있다. – semafor

+0

좋지 않은 경우, 일부 데이터베이스 정보 또는 doctrine 매핑 파일 (doctrine을 사용하는 경우)을 제공 할 수 있습니까? – Jeroen

0

귀하의 필요를 이해하는 한 leftJoin을 사용하면 안됩니다.이 필드를 사용하면 자녀가없는 부모를 얻을 수 있습니다. 대신 innerJoin을 사용하십시오.

child.IdP가 모델 정의에서 parent.id를 참조한다고 가정하면 이런 식으로 WITH 절을 사용할 필요가 없습니다. 따라서 queryBuilder는 다음과 같습니다.

$query = $this->getEntityManager()->createQueryBuilder(); 
$query->select("parent") 
    ->from('TestAppBundle:Parent', 'parent') 
    ->innerJoin("parent.children", 'child') 
    ->where('child.date < :date and child.status = :null') 
    ->setParameter('date', new DateTime()) 
    ->setParameter('null', 0); 

감사합니다.