学说2:水合键值数组

时间:2014-07-21 09:12:07

标签: php doctrine-orm

为什么这个查询不起作用?

    $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。

3 个答案:

答案 0 :(得分:1)

如果您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现在应该按照您希望的方式包含值。

答案 1 :(得分:0)

This trait将以简单实体字段的预期格式为您提供结果。在您的存储库中use之后,您可以像这样使用它:

$em->getRepository('AppBundle:Branch')->getIndexedList('id', 'name');

但是,就您的情况而言,由于它有一些聚合结果,您可以在存储库中编写类似的函数。

(尽管这是一个非常老的问题,将其张贴在此处,以便为正在寻找类似想法的人提供提示。)

答案 2 :(得分:0)

正如其他人已经说过的那样,默认情况下,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');