2012-11-28 3 views
5

처음에는 몇 가지 의사 코드로 예제를 제공 한 다음 문제가 무엇인지 설명하겠습니다. User와 Phonenumber의 두 엔티티가 있다고 가정 해 보겠습니다. 그들의 관계는 일대 다입니다. 내가 좋아하는 뭔가가 있다면 내 응용 프로그램에서교리 가져 오기 연결

class UserRepository 
{ 
    public function getUser($id, $type) 
    { 
     $users = $this->createQuery("SELECT u, p FROM User u JOIN u.phonenumbers p 
      WHERE u.id = :id AND p.type = :type") 
      ->setParameters(array(
       'id' => $id, 
       'type' => $type, 
      )) 
      ->getResult(); 
     return $users[0]; 
    } 
} 

: 그래서

$user = $userRepo->getUser(1, 'home'); 
var_dump($user->getPhonenumbers()); // here phonenumbers collection is ok 

$user = $userRepo->getUser(1, 'work'); 
var_dump($user->getPhonenumbers()); // Here phonenumbers collection is wrong. 
           // It's exactly the same as the previous one. 

을 내 질문은 : 내 UserRepository에서 나는 그런 일이있을 수는 (다른 기준)에 가입 가져 오기 사용 가능 매번 적절한 컬렉션을 얻으려면?

답변

3

컬렉션 가져 오기 및 필터링은 서로 잘 작동하는 것이 아닙니다. 여기 당신이 그것을해야하는 방법은 다음과 같습니다

SELECT 
    u, p 
FROM 
    User u 
JOIN 
    u.phonenumbers p 
JOIN 
    u.phonenumbers p2 
WHERE 
    u.id = :id 
    AND 
    p2.type = :type 

이 올바른 수화 및 필터링을 초래하는 가입 (수화되지 않음) p2 두 번째에 필터링을 적용합니다.

+0

필자는 Query :: HINT_REFRESH를 사용하여 최종적으로 성능에 영향을 미칠 것으로 생각되지만, 분명히 솔루션을 점검 할 것입니다. 시간 내 줘서 고마워. – ventsislaf

-2

querybuilder를 사용하면 훨씬 간단합니다.

public function getUser($id, $type) 
{ 
    return $this->createQueryBuilder("u") 
     ->leftJoin("u.Phonenumbers", "p", "WITH", "p.type=:type") 
     ->where("u.id=:id") 
     ->setParameters(.....) 
     ->getQuery() 
     ->getOneOrNullResult() ; 
} 
+0

이 예제는 단순한 의사 코드입니다. 문제는 제공된 코드가 아니라 교리의 행동에 있습니다. – ventsislaf

+0

여전히 동일한 방법으로 쿼리를 작성하는 방법에 관계없이 leftJoin 및 WITH 문을 사용하십시오. – Zeljko

+0

예가 잘못되었습니다. – Ocramius