22

是否可以更改 Doctrine2 中 getResult() 的数组键值?

例子:

$qb->select('t.id, t.name')->from('Table', 't');

当我打印这个时,我得到了,这不是我想要的:

print_r($qb->getQuery()->getResult());

//Print result: Array ( [0] => Array ( [id] => 20 [name] => Name1 ) [1] => Array ( [id] => 21 [percentagem] => Name2 ) )

我想要的是:

Array ( [20] => Array ( [id] => 20 [name] => Name1 ) [21] => Array ( [id] => 21 [percentagem] => Name2 ) )

建议,提示将不胜感激。

4

3 回答 3

35

我真的很高兴这件事有多酷:

$query = $this->getEntityManager()->createQuery('
            SELECT user FROM UserBundle:User user
            INDEX BY user.id
            WHERE user.id = 1
            '
        );

INDEX BY 构造不会直接转换为 SQL,但会影响对象和数组的水合。在每个 FROM 和 JOIN 子句之后,您指定该类应在结果中索引的字段。默认情况下,结果由从 0 开始的数字键递增。但是,您可以使用 INDEX BY 指定任何其他列作为结果的键,但它实际上只对主字段或唯一字段有意义。

资料来源:Doctrine ORM 2 使用 INDEX BY 的文档

  • 请在 WHERE 之前使用 INDEX BY
于 2013-03-10T19:24:54.930 回答
21

但是,为了完整起见,您可以对查询生成器执行相同的操作,如下所示:

$queryBuilder = $this->getEntityManager()->createQueryBuilder();

$queryBuilder
    ->select('user')
    ->from('UserBundle:User', 'user', 'user.id')
    ->where('user.id = :userId')
    ->setParameter('userId', $userId)
;

var_dump(
    $queryBuilder->getQuery()->getArrayResult()
);

如您所见,索引选项可用作查询构建器from方法的第三个参数:

/**
 * Creates and adds a query root corresponding to the entity identified by the given alias,
 * forming a cartesian product with any existing query roots.
 *
 * <code>
 *     $qb = $em->createQueryBuilder()
 *         ->select('u')
 *         ->from('User', 'u')
 * </code>
 *
 * @param string $from    The class name.
 * @param string $alias   The alias of the class.
 * @param string $indexBy The index for the from.
 *
 * @return QueryBuilder This QueryBuilder instance.
 */
public function from($from, $alias, $indexBy = null)
{
    return $this->add('from', new Expr\From($from, $alias, $indexBy), true);
}
于 2015-07-24T14:25:41.263 回答
0

只需使用的第三个参数->from(entity, alias, indexBy)

所以与其

$qb->select('t.id, t.name')->from('Table', 't');

采用

$qb->select('t.id, t.name')->from('Table', 't', 'Table.id');

PS:@Francesco-Casula 用更多细节写了很好的答案,好吧。

于 2017-02-08T11:52:45.640 回答