在连接中丢失了带连接的列定义

时间:2013-05-16 02:46:03

标签: symfony symfony-2.2

我在学说中设置了一个查询,我确信它应该做什么......它加入了几个表,所以我们可以跳过一堆额外的查询来通过外键获取数据:

$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}}这样的变量(顺便说一下,确实存在)......但我不能。

任何想法都会非常感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您的混淆源于您创建了一个返回标量结果的查询:COUNT(c)...以及对象。

这意味着您没有像预期的那样返回Article个实体数组(您尝试使用post.image),而是实际获得了一个关联数组,其中每个成员都包含count - {{ 1}}和文章实体post.comments

n.b。如果要访问与文章关联的图像,则需要使用post.article

我会试着说明一下:

您期望可以迭代的一系列文章对象:

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 ) ) ,那么您将获得第一个示例,将其保留,您将获得第二个示例。

Doctrine documentation on pure/mixed results对此有一些很好的解读/解释。

作为旁注,您是否有任何理由编写原始SQL。首先,您可以使用DQL重新编写查询,以利用Doctrine提供的一些强大功能。

COUNT(c) AS comments