2012-02-27 3 views
9

symfony 프레임 워크는 php를 통해 실행되어 일부 유지 보수 작업을 수행 할 수있는 app/console 파일을 제공합니다. 또한 사용자가 DQL 쿼리를 실행할 수 있습니다.Doctrine은 특정 필드를 선택할 수 없습니다.

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id, u.nameFirst, u.nameLast FROM DatabaseBundle:User u' 
array 
    0 => 
    array 
     'id' => string '1' (length=1) 
     'nameFirst' => string 'jaroslav' (length=8) 
     'nameLast' => string 'rakhmatoullin' (length=13) 
    1 => 
    array 
     'id' => string '2' (length=1) 
     'nameFirst' => string 'Båb Kåre' (length=10) 
     'nameLast' => string 'Ytrefoss' (length=8) 

세 개의 특정 열을 선택했는지 확인합니다. 내가 겪고있는 문제는 두 테이블을 조인 할 때 비슷한 쿼리를 통해 오류가 발생한다는 것입니다.

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r' 

    [Doctrine\ORM\Query\QueryException]     
    [Semantical Error] line 0, col -1 near 'SELECT u.id ,': 
    Error: Cannot select entity through identification variables 
    without choosing at least one root entity alias. 

전체 사용자가 자신의 역할과 합류 다음 반환 : 분명히

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u, r FROM DatabaseBundle:User u JOIN u.roles r' 

, 내가 모르는 뭔가가있어.

아이디어가 있으십니까? 적절한 문서에 대한 링크도 고맙겠습니다. documentation on "Partial Object Syntax"에서

+1

나는 아주 잘 오류 메시지를 이해하지 않는,하지만 난 유사한 오류 메시지가 발생하고, r.id을 선택하여 내 문제를 해결 기억, 그래서 당신이 더 많은 필드를 선택하려고한다고 생각합니다. – greg0ire

+1

어떨까요? ''SELECT u.id, r. * FROM DatabaseBundle : User u JOIN u.roles r'' – jere

+1

greg0ire 맞습니다. 나는 당신이 하나의 필드와 같은 쿼리에서 "엔터티"개체를 선택할 수 없다고 생각합니다. – jere

답변

28

:

교리에 DQL 쿼리를 실행하고 해당 개체에 대한 필드 중 일부만을 선택하면 기본적으로 개체를 다시받지 않습니다. 대신, SQL을 직접 사용하고 일부 데이터를 결합하는 경우와 같은 방식으로 평면형 사각형 결과 집합으로 배열 만받습니다.

부분 개체를 선택하려면 부분 DQL 키워드를 사용할 수 있습니다.

php console doctrine:query:dql --hydrate array \ 
    'SELECT partial s.{name ,id}, partial c.{name, id } 
    FROM DatabaseBundle:ProductCategories c 
    JOIN c.suppliers s ORDER BY s.name, c.name' 
+1

참고 : 기본 키 부분 쿼리에서 - 그렇지 않으면 심한 오류가 발생합니다. –

+2

2 년 후에 나는 내 자신의 대답을 잘 이해하지 못한다. 그러나 정확하게 기억한다면 핵심은 모든 제품 카테고리가 "c"로 매핑되고 모든 카테고리. 공급 업체 []가 s로 매핑된다는 것입니다. 모든 카테고리에는 ProductCategories 클래스의 "@ annotated-join"을 통해 매핑 된 공급 업체가 있습니다. 모든 up-votes에 감사드립니다. 10이면 충분하다고 생각합니다. –

+1

하지만 전체 오브젝트를 정말로 갖고 싶다면 어떻게해야할까요? 예를 들어 객체 A의 필드와 객체 B의 전체 필드를 의미합니까? –

관련 문제