我在学说中设置了一个查询,我确信它应该做什么......它加入了几个表,所以我们可以跳过一堆额外的查询来通过外键获取数据:
$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 :(得分: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