2013-05-16 4 views
1

doctrine에 설정된 쿼리가 있습니다. 확신 할 수있는 쿼리가 있습니다. 여러 테이블을 조인하므로 데이터를 얻기 위해 여러 쿼리를 건너 뛸 수 있습니다 외래 키를 통해 :나뭇 가지에 조인이있는 열 정의가 손실되었습니다.

내가 너무 좋아, 아주 성공적으로 데이터에 액세스 할 수있어
$posts = $this->getDoctrine()->getManager() 
     ->createQuery(' 
      SELECT a AS article, COUNT(c) AS comments 
      FROM ArticleBundle:Article a 
       LEFT JOIN CommentsBundle:Comment c WITH (c.article = a.id) 
       LEFT JOIN ImageBundle:Image i WITH (i.id = a.image) 
      GROUP BY a.id 
      ORDER BY a.timestamp DESC 
     ') 
     ->getResult(); 

:이 문제는 최대한 빨리 두 번째 열을 추가로이다

{% for post in posts %} 
<div id="news-story"> 
<div class="title">{{ post.article.title }}</div> 
<div class="comments">{{ post.comments }}</div> 
... 
{% endfor %} 

는 ("나는 이미지로")를 필드 목록에 추가하면 실패합니다. 나는 "배열"에 대한 다음과 같은 메시지 ...

항목 "기사"를 얻을 ...에

존재하지 않습니다 ... 그리고 나는 아주 이유를 알아낼 수 없습니다. 나는 {{post.article.title}}과 {{post.image.path}} 같은 변수에 접근 할 수 있기를 바랄 것입니다.

모든 의견을 크게 기뻐할 것입니다.

감사합니다.

+0

나는 여전히 symfony2에 초보자 해요,하지만 난 유 포스트를 덤프 어쩌면 경우 문제, 넣어 {{덤프 (게시물)}} HTTP 이해하게 될 것입니다 당신을 말할 수 : //twig.sensiolabs .org/doc/functions/dump.html –

+0

이미지 엔티티와 기사 엔티티 사이에 관계가 있습니까? –

+0

그래! 기사 엔티티는 이미지 엔티티에 대한 "이미지"라는 열에 OneToOne 관계가 있습니다. – mchitten

답변

2

스칼라 결과를 반환하는 쿼리를 만들었 기 때문에 혼란 스러울 것이라고 생각합니다. 객체와 함께 COUNT(c).... post.comments 및 문서 엔티티 post.article -

이 예상대로 실제로 각 구성원 수를 포함하는 연관 배열을 얻을 (당신이 post.image을 사용하려고), 대신 Article 개체의 배열을 반환하는 것을 의미한다.

n.b. 기사와 관련된 이미지에 액세스하려면 post.article.image을 사용해야합니다.

나는 시도하고 설명합니다 :

귀하는 반복 할 수 문서 객체의 배열 기대 :

array(
    [0] => ArticleEntity, 
    [1] => ArticleEntity, 
    [2] => ArticleEntity 
) 

실제로 쿼리에서 얻을 무엇

array(
    [0] => array(
     'article' => ArticleEntity, 
     'comments'=> 10 
    ), 
    [1] => array(
     'article' => ArticleEntity, 
     'comments'=> 3 
    ), 
    [2] => array(
     'article' => ArticleEntity, 
     'comments'=> 0 
    ) 
) 

하는 경우를 쿼리의 스칼라 부분을 제거하면 COUNT(c) AS comments 첫 번째 예제가 표시되고 두 번째 예제가 표시됩니다.

Doctrine documentation on pure/mixed results은 이에 대한 좋은 읽기/설명입니다.

원시 메모를 작성하는 이유가 있습니다. 시작을 위해 DQL을 사용하여 쿼리를 다시 작성하여 Doctrine이 제공하는 몇 가지 파워를 활용할 수 있습니다.

$qb = $this->getDoctrine()->getManager()->createQueryBuilder(); 

$qb 
    ->select('article', 'image', 'COUNT(comments) as comment_count') 
    ->from('ArticleBundle:Article', 'article') 
    ->leftJoin('article.comment', 'comments') 
    ->leftJoin('article.image', 'image') 
    ->groupBy('article.id') 
    ->orderBy('article.timestamp', 'DESC') 
; 

$posts = $qb->getQuery()->getResult(); 
+0

매우 유익하고 환상적입니다. 내가 뭘 찾고 있었는지. 감사! – mchitten