是否使用HYDRATE_ARRAY强制“提取已加入”关系以包含其ManyToOne关系的标识?

时间:2019-01-13 16:32:44

标签: symfony doctrine-orm php-7

我有一个查询,其中我要将许多表联接到原始的Person实体。 Person可能有多个Child关系(OneToMany),而Child可能有一个School他们去了(ManyToOne)。问题是,我不需要连接到每个孩子的整个School实体,只需要他们的id,该实体已经存储在Child上。

我正在使用Paginator遍历结果,并使用HYDRATE_ARRAY来减少将数据解析为实体对象的ORM的开销。但是未获取关系的id字段不会以这种方式返回,因此,学校id也不会返回。

我也可以加入School实体,但是由于标识已经存储在Child记录中,所以我不明白为什么我应该通过让数据库加入另一个表来进一步降低性能。将结果作为实体对象获取也可以解决该问题,但是也会以性能为代价。如何获得id贴附结果而不必不必要地加入School实体或不必将结果水化为对象?

$query = $em->getRepository(Entity\Person::class)->createQueryBuilder('p');

$query
  ->select([
    'p as person',
    'w.name as workplace_name',
    'c',
  ])
  ->leftJoin('p.children', 'c') //Entity\Child
  ->leftJoin('p.workplace', 'w') //Entity\Company
  //...

;
$paginator = new Paginator($query);
$paginator->getQuery()
  ->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY);

1 个答案:

答案 0 :(得分:1)

您可以使用Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS在结果中包括外键列值:

$paginator->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY);

其中:

  

includeMetaColumns查询提示使元列(例如外键和鉴别符列)被选择并作为查询结果的一部分返回。

参考