2011-11-09 1 views
5

내 응용 프로그램에는 관련 테이블에서 허용되는 값 목록을 제공하는 데 사용되는 여러 가지 간단한 참조/조회 데이터베이스 테이블이 있습니다.Doctrine에서 참조 테이블/조인 테이블 조인 방지 2

(당신은 ...는 '국가'표는 주소 테이블의 '국가'필드에 허용되는 국가의 목록을 가지고, 알고)

가능한 한 린 내 데이터 모델을 유지하기 위해, I 조회 테이블의 'id'열을 건너 뛰고 실제 값을 기본 키로 사용하는 "Bill Karwin technique"을 사용하십시오. 그런 식으로 외부 테이블처럼 이미 존재하기 때문에 메인 테이블의 값을 얻기 위해 조인 할 필요가 없습니다.

문제는 Doctrine은 모든 연결에 대해 개체 참조를 사용하기 때문에 주 테이블에 이미 필요한 값이있는 경우에도 조회에 여전히 조인이 필요하다는 의미입니다.

예를 들어,이 쿼리가 작동하지 않습니다

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country')) 
    ->from('Entity\Address', 'a'); 

을 대신,이 작업을 수행해야합니다 :

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country')) 
    ->from('Entity\Address', 'a') 
    ->join('a.country', 'c'); 

그렇지 않으면이 오류 얻을 :. "잘못된 PathExpression을 StateFieldPathExpression이어야합니다 . "

조회 테이블에 필요한 모든 조인을 추가하면 쿼리에 불필요한 비용이 많이 듭니다.

누가 Doctrine 2에서 조회/참조 테이블 조인을 수행하지 않아도되는 좋은 방법을 알고 있습니까?

(PS -. 그들은 not supported by Doctrine있어 다른 well-documented disadvantages을 가지고있는 나는, 열거 형을 사용하지 않으려는)

답변

6
예, 이런 종류의 짜증

하지만 나는 그들이 그 일을 위해 좋은 이유가 같아요 방법.

HINT_INCLUDE_META_COLUMNS 힌트를 사용할 수 있습니다. 릴레이션으로 매핑되는 외래 키를 포함하여 쿼리 결과의 모든 필드가 포함됩니다.

$query = \Doctrine::em()->createQuery($queryString) 
    ->setParameters($params) 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE); 

은 그래서 당신은 필드에게 데시벨에서 Address 테이블에 city_id이 귀하의 경우, 그것은 또한 "표준"도시 관계와 함께, 질의 결과로 출력됩니다.

+0

위대한입니다 - 나는 setHint() 메서드에 대해 잘 알지 못했고 잘 사용하도록 계획했습니다. – cantera

+1

Set 힌트는 메타 열을 포함하는 것뿐만 아니라 모든 종류의 물건에 사용됩니다. 모든 쿼리와 함께 실행되는 쿼리 워커를 첨부하는 방법입니다. 당신은 또한 당신이 원하는 무엇이든하는 당신 자신의 힌트를 만들 수 있습니다. 좋은 작은 일이 아니다;) – ZolaKt

+0

경고 : Doctrine은 null을 보유하는 외래 키를 포함하지 않는다. 도시 ID가 의무적이지 않은 것처럼 항상 존재하지는 않습니다. 그냥 캐시 문제라고 생각하면서 2 시간을 보냈습니다 :) –