2012-10-31 4 views
4
내가 SQL이 보이는 쿼리를 만들 DQL을 사용하려면

와 조인하위 쿼리는 교리 DQL

select 
    e.* 
from 
    e 
inner join (
    select 
     uuid, max(locale) as locale 
    from 
     e 
    where 
     locale = 'nl_NL' or 
     locale = 'nl' 
    group by 
     uuid 
) as e_ on e.uuid = e_.uuid and e.locale = e_.locale 

내가 쿼리 및 하위 쿼리를 생성하는 QueryBuilder를 사용하려고 노력했다. 나는 그들이 그들 자신에 의해 옳은 일을한다고 생각하지만 나는 그것들을 결합 선언문에 결합 할 수 없다. 이것이 DQL로 가능하다면 지금 아무도 없습니까? 실제 객체를 반환하기 때문에 native SQL을 사용할 수 없으며이 쿼리가 실행되는 객체를 알지 못합니다 (uuid 및 locale 속성이있는 기본 클래스 만 알고 있음).

$subQueryBuilder = $this->_em->createQueryBuilder(); 
    $subQueryBuilder 
     ->addSelect('e.uuid, max(e.locale) as locale') 
     ->from($this->_entityName, 'e') 
     ->where($subQueryBuilder->expr()->in('e.locale', $localeCriteria)) 
     ->groupBy('e.uuid'); 

    $queryBuilder = $this->_em->createQueryBuilder(); 
    $queryBuilder 
     ->addSelect('e') 
     ->from($this->_entityName, 'e') 
     ->join('('.$subQueryBuilder.') as', 'e_') 
     ->where('e.uuid = e_.uuid') 
     ->andWhere('e.locale = e_.locale'); 
+0

하위 쿼리에서 INNER JOIN을 수행하는 것은 정확히 [무엇을하려고하는지]입니다 (http://stackoverflow.com/questions/27007090/inner-join-results-from-select-statement-using-doctrine -querybuilder). 해결책을 찾았습니까? –

답변

0

DQL의 FROM 절에 하위 쿼리를 추가 할 수 없습니다.

귀하의 PK가 {uuid, locale}이라고 가정하겠습니다. 귀하의 IRC에 관한 논의 내용입니다. 쿼리에 두 개의 다른 열이 있으므로 추울 수 있습니다. 당신이 할 수있는 WHERE 절에 퍼팅입니다 :

select 
    e 
from 
    MyEntity e 
WHERE 
    e.uuid IN (
     select 
      e2.uuid 
     from 
      MyEntity e2 
     where 
      e2.locale IN (:selectedLocales) 
     group by 
      e2.uuid 
    ) 
    AND e.locale IN (
     select 
      max(e3.locale) as locale 
     from 
      MyEntity e3 
     where 
      e3.locale IN (:selectedLocales) 
     group by 
      e3.uuid 
    ) 

내가 당신이 :selectedLocales에 결합 로케일 (비 비어 있음) 배열에 대한 비교를 사용 있습니다. 이는 추가 로케일과 일치시키려는 경우 쿼리 캐시가 손상되는 것을 방지하기위한 것입니다.

조건부를 동적으로 추가하는 경우 쿼리 캐시를 중단하는 것이 더 간단 할 것이므로 쿼리 작성기를 사용하여이 기능을 구축하지 않는 것이 좋습니다 (3 개의 쿼리 작성기가 포함되어 있습니다!)

+0

결과의 각 행에 대한 uuid와 로케일 사이에 관계가 없기 때문에 이것이 작동하지 않을 것이라고 생각합니다. –

+0

네 말이 맞아 ... 이건별로 효과가 없을거야. 'uuid'와'locale' 필드를'concat'하고 검사를 할 수도 있지만, 그런 경우에는 어떤 키도 쓸모 없게됩니다 (좋은 해결책이 아닙니다) – Ocramius