如何在 Doctrine2 的查询结果中获取 Collection
Posted
技术标签:
【中文标题】如何在 Doctrine2 的查询结果中获取 Collection【英文标题】:How to get a Collection in Doctrine2's query results 【发布时间】:2012-01-02 00:36:19 【问题描述】:我正在尝试使用教义2 执行查询并需要它返回一个集合对象。
简化的sn-p:
$players = $this->getEntityManager()
->createQueryBuilder()
->select('p')
->from('...\Player', 'p')
->getQuery()
->getResult();
返回的对象是一个玩家数组。
query result formats 上的信息说:
结果是对象的普通集合(纯)或对象嵌套在结果行中的数组(混合)。
结果类型取决于什么以及如何获得一个集合对象?
【问题讨论】:
【参考方案1】:getResult()
总是返回一个数组。如果你想要一个集合,你必须将getResult()
返回的数组传递给Doctrine的ArrayCollection
例如
use Doctrine\Common\Collections\ArrayCollection;
$result = $this
->getEntityManager()
->createQueryBuilder()
->select('p')
->from('...\Player', 'p')
->getQuery()
->getResult()
;
$players = new ArrayCollection($result);
【讨论】:
【参考方案2】:要返回一个对象而不是数组,你必须使用“部分对象”。
这里是测试代码示例https://***.com/a/12044461/1178870
【讨论】:
这只是将每个实体作为通用对象(而不是实体类)返回。 OP 想要一个实体集合(从学说中实现 Collection 接口)而不是实体数组。【参考方案3】:由于您只选择“p”个对象(没有单独的列或聚合值)并且您使用 getResult() 进行水合模式,因此您的查询应该返回纯对象而不是数组。
我的最佳猜测是问题与您用于构建查询的速记语法有关。我会尝试的第一件事是写出这样的查询“长格式”:
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
$qb->select('p')
->from('...\Player', 'p');
$query = $qb->getQuery();
$players = $query->getResult();
我猜你的速记方法会很好,但我发现 Doctrine 在方法链方面有点挑剔。
根据您的 sn-p 的简化程度,还有其他一些事情需要考虑。但根据我的经验,如图所示编写的查询将返回 Player 对象。
【讨论】:
对了,你也可以考虑切换到2.1版的手册。 2.1 中添加了一些重要的新功能(例如支持外键作为主键),如果您使用的是旧版本的文档,可能会导致混淆。 我尝试使用较少的方法链接但没有成功。我的原始查询更复杂(如果不是,我会使用我的 playerRepository 的 findAll() 方法 - 有趣的是它返回一个集合),但我在第一篇文章中给出的查询已经存在问题。 如图所示的查询会产生对象。如果您的查询没有,那么您的代码或数据存储存在另一个问题,仅根据您提供的信息无法解决。以上是关于如何在 Doctrine2 的查询结果中获取 Collection的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Symfony3在Doctrine2 Entity中运行查询查询