是否可以在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 ) )
建议,提示将不胜感激.
小智 36
我真的很高兴这件事有多酷:
$query = $this->getEntityManager()->createQuery('
SELECT user FROM UserBundle:User user
INDEX BY user.id
WHERE user.id = 1
'
);
Run Code Online (Sandbox Code Playgroud)
INDEX BY构造不会直接转换为SQL,但会影响对象和数组的水合作用.在每个FROM和JOIN子句之后,您可以指定此类应在结果中编入索引的字段.默认情况下,结果会以从0开始的数字键递增.但是使用INDEX BY,您可以指定任何其他列作为结果的键,但它实际上只对主要或唯一字段有意义.
来源:使用INDEX BY的Doctrine ORM 2文档
Fra*_*ula 17
但是,为了完整起见,您可以对查询构建器执行相同操作,如下所示:
$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()
);
Run Code Online (Sandbox Code Playgroud)
如您所见,index by option可用作查询构建器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);
}
Run Code Online (Sandbox Code Playgroud)