2013-05-16 2 views
1

У меня есть запрос, настроенный в доктрине, что я уверен, делает то, что он должен ... он объединяет несколько таблиц, поэтому мы можем пропустить кучу дополнительных запросов для получения данных через внешние ключи:Потерянные определения столбцов с объединениями, в twig

$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)... вместе с объектами.

Это означает, что вместо того, чтобы возвратить массив Article сущностей, как вы ожидаете (вы пытаетесь использовать post.image), вы на самом деле получить ассоциативный массив, в котором каждый член содержит счетчик - post.comments и статьи сущность post.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 - это хорошее чтение/пояснения по этому вопросу.

В качестве побочного примечания есть причина, по которой вы пишете исходный SQL. Для начала вы можете повторно написать запрос с помощью 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

 Смежные вопросы

  • Нет связанных вопросов^_^