我有一个查询,其中我要将许多表联接到原始的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);
答案 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查询提示使元列(例如外键和鉴别符列)被选择并作为查询结果的一部分返回。
参考