强制'fetch joined'关系包括其多对一关系的身份使用HYDRATE_ARRAY?



我有一个查询,在该查询中,我将多个表连接到我的原始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而不获取整个对象

相关内容

  • 没有找到相关文章

最新更新