给定两个学说实体(Person
和Company
),一对多关联,以及一个看起来像这样的存储库
namespace TestBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;
class PersonRepository extends EntityRepository {
public function findAllByAge($age) {
$qb = $this->createQueryBuilder('p')
->select('p','c')
->leftjoin('p.company', 'c')
->where("p.age = :age")
->setParameter('age', $age);
// ...
}
}
如何检索公司的实体(对象或名称),最好从 $qb 对象(或从别名、DQL、AST、解析器等)中检索?
理想情况下,我希望有一个数组,其中包含 Querybuilder 实例使用的所有别名,或者至少是那些在select方法中定义的别名及其实体,格式如下:
[
'p' => 'TestBundle\Entity\Person',
'c' => 'TestBundle\Entity\Company',
// etc
]
在$qb->getDQLPart('join')
甚至更低级别的东西中,例如$qb->getQuery()->getAST()->fromClause->identificationVariableDeclarations
有关于别名的连接信息,但它只包含根实体及其别名(p = TestBundle\Entity\Person)。
getRootEntity
, getRootAliases
,getAllAliases
没有帮助,因为我获得了根实体和/或所有别名,但无法将它们链接在一起。
$em->getClassMetadata($rootentity)->associationMappings
给我根实体的关联,它包含连接的目标实体,但没有别名。我当然可以将字段名称映射到信息$qb->getDQLPart('join')
,但这会让我进入一个我必须从每个实体对象递归地爬取信息的区域。这似乎会导致严重的错误。
Querybuilder 如何将关联转换为正确的实体?或者它根本不这样做,只是解析到较低级别的东西而不知道它正在使用什么实体?
我需要这些信息,以便确保某些实体字段上有特定的二级索引。这些二级索引可以使用注解来设置,并通过学说($em->getClassMetadata($entity)->table['indexes']
)存储在实体中。
在构建查询时,我需要(以编程方式)知道哪些字段具有二级索引,并且希望尽可能保持在抽象树的较高位置。