我有一个查询,在该查询中,我将多个表连接到我的原始Person实体。Person
可以具有多个Child
关系(OneToMany),并且Child
可以具有它们去往的School
(ManyToOne)。问题是,我不需要连接到每个子级的整个School
实体,只需要它们的id
,它已经存储在Child
上。
我使用Paginator
来迭代结果,并使用HYDRATE_ARRAY来减少ORM将数据解析为实体对象的开销。但不匹配关系的id
域没有以这种方式返回,因此,学校id
也没有。
我也可以加入School
实体,但由于标识已经存储在Child
记录上,我不明白为什么要让数据库加入另一个表来进一步降低性能。将结果作为实体对象获取也可以解决问题,但也会以性能为代价。我如何让id
感知结果,而不必不必要地加入School
实体或将结果作为对象进行水合?
$query = $em->getRepository(EntityPerson::class)->createQueryBuilder('p');
$query
->select([
'p as person',
'w.name as workplace_name',
'c',
])
->leftJoin('p.children', 'c') //EntityChild
->leftJoin('p.workplace', 'w') //EntityCompany
//...
;
$paginator = new Paginator($query);
$paginator->getQuery()
->setHydrationMode(DoctrineORMQuery::HYDRATE_ARRAY);
您可以使用Doctrine\ORM\Query::HINT_INLUDE_META_COLUMNS在结果中包括外键列值:
$paginator->getQuery()
->setHint(DoctrineORMQuery::HINT_INCLUDE_META_COLUMNS, true)
->setHydrationMode(DoctrineORMQuery::HYDRATE_ARRAY);
其中:
includeMetaColumns查询提示会选择像外键和鉴别器列这样的元列,并将其作为查询结果的一部分返回。
参考
- 条令\ORM\查询文档
- 如何在不加载关联对象的情况下获得条令2中的关联外键ID
- 在条令中只从实体关系中获取ID而不获取整个对象