如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何从原始查询中获取 sql 结果

Doctrine2 - 继承映射,查询子类

如何使用Symfony3在Doctrine2 Entity中运行查询查询

使用 LIMIT 查找 MySQL 中结果总数的教义查询

在 Doctrine2 DQL 查询上进行排序的 CASTING 属性

Symfony4 UnitTest 中的 Doctrine2 orderBy