1

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

$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 %}

问题是,只要我在字段列表中添加第二列(“i AS image”),它就会失败。我收到以下消息...

“数组”的项目“文章”在...中不存在

......我不太明白为什么。我希望我能够访问像 {{ post.article.title }} 和 {{ post.image.path }} 之类的变量(顺便说一句,确实存在)......但我不能。

任何想法将不胜感激。

谢谢!

4

1 回答 1

2

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

这意味着您实际上得到了一个关联数组,其中每个成员都包含计数和文章实体,而不是返回一个Article实体数组,正如您所期望的(您正在尝试使用) 。post.imagepost.commentspost.article

nb 如果要访问与文章关联的图像,则需要使用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 文档是对此的一些很好的阅读/解释。

作为旁注,您是否有任何理由编写原始 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();
于 2013-05-16T02:59:41.727 回答