原则2:键值数组


Doctrine 2: Hydrate key-value array

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

    $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没有任何消息。

如果您将查询中的行COUNTGROUPED,则它将返回多个结果,其中包含每个组的计数。在您的示例中,您将获得每个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');