如何获取Doctrine2的查询结果中的Collection

问题描述 投票:0回答:3

我正在尝试使用doctrine2执行查询并需要它返回一个集合对象。

简化片段:

$players = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

返回的对象是一个Player数组。

关于查询结果格式的信息说:

结果要么是对象的普通集合(纯),要么是对象嵌套在结果行中的数组(混合)。

结果类型取决于什么以及如何实现获取集合对象?

doctrine doctrine-orm
3个回答
77
投票

getResult()
始终返回一个数组。如果你想要一个集合,你必须将
getResult()
返回的数组传递给 Doctrine 的
ArrayCollection

例如

use Doctrine\Common\Collections\ArrayCollection;

$result = $this
    ->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult()
;

$players = new ArrayCollection($result);

1
投票

由于您仅选择“p”对象(没有单独的列或聚合值)并且您使用 getResult() 作为水合作用模式,因此您的查询应该返回纯对象而不是数组。

我最好的猜测是,问题与您用来构建查询的速记语法有关。我尝试的第一件事是写出查询“长格式”,如下所示:

$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();

$qb->select('p')
   ->from('...\Player', 'p');

$query = $qb->getQuery();
$players = $query->getResult();

我猜你的速记方法会很好,但我发现 Doctrine 在方法链接方面有点挑剔。

根据代码片段的简化程度,还有其他一些事情需要考虑。但根据我的经验,如图所示编写的查询将返回 Player 对象。


-1
投票

要返回对象而不是数组,您必须使用“部分对象”。

这里是经过测试的代码示例https://stackoverflow.com/a/12044461/1178870

© www.soinside.com 2019 - 2024. All rights reserved.