为什么这个查询不起作用?
$query = $this->_em->createQuery('
SELECT
COUNT(p) AS products_count
FROM
Application'Entity'Category c
INDEX BY c.id
LEFT JOIN c.products p
GROUP BY
c.id
');
$rows = $query->getSingleScalarResult();
我希望得到的结果为:"category_id => products_count"数组,但它抛出一个Doctrine'ORM'NonUniqueResultException没有任何消息。
如果您将查询中的行COUNT
为GROUPED
,则它将返回多个结果,其中包含每个组的计数。在您的示例中,您将获得每个Category
的计数。
如果您尝试对包含多个条目的结果执行getSingleScalarResult()
,它将生成Doctrine'ORM'NonUniqueResultException
。相反,您应该使用getScalarResult()
并遍历条目。
要将结果转换为形式array("category_id" => "products_count_value")
,可以使用以下代码:
$output = array();
foreach ($rows as $category, $values) {
$output[$category] = $values['products_count'];
}
$output
现在应该包含您想要的值
这个特性将为简单实体字段提供预期格式的结果。在您的存储库中使用use
之后,您可以这样使用它:
$em->getRepository('AppBundle:Branch')->getIndexedList('id', 'name');
但是,对于您的情况,由于它有一些聚合结果,您可以在存储库中编写类似的函数。
(虽然这是一个非常古老的问题,但把它贴在这里是为了给那些正在寻找类似想法的人一个提示)
正如其他人已经说过的,Doctrine默认不支持这一点。您可以使用PHP的array_column
函数:
$query = $this->_em->createQuery('
SELECT
COUNT(p) AS products_count, c.id AS category_id
FROM
Application'Entity'Category c
LEFT JOIN c.products p
GROUP BY
c.id
');
$pairs = array_column($query->getArrayResult(), 'products_count', 'category_id');