查询具有嵌套的多对一和多对一的复杂Doctrine关系


Querying a complex Doctrine relationship with nested ManyToOne and OneToMany

我有一个相当复杂的Doctrine关系架构,查询起来很头疼。它是这样写的:

项目

[OneToMany, Bidirectional] 里程碑

<

里程碑/strong> [OneToMany, Bidirectional] Sprint

Sprint

[OneToMany, Bidirectional]

因此,票据直接依赖于Sprint,而不是项目或里程碑。它几乎就像一个树形层次结构。效果很好。然而,我有严重的问题:

  • 如何从特定项目中发现所有门票?
  • 如何从特定里程碑发现所有票证?

使用条令查询生成器,您可以从这样的项目中获得所有门票:

$project_id = ...
$repository = $this->getDoctrine()->getRepository('AcmeBundle:Ticket');
$query = $repository->createQueryBuilder('t')
                    ->join('t.sprint', 's')
                    ->join('s.milestone', 'm')
                    ->join('m.project', 'p')
                    ->where('p.id = :project_id')
                    ->setParameter('project_id', $project_id)
                    ->getQuery();

这就是从一个里程碑中获取所有票证的方式:

$milestone_id = ...
$repository = $this->getDoctrine()->getRepository('AcmeBundle:Ticket');
$query = $repository->createQueryBuilder('t')
                    ->join('t.sprint', 's')
                    ->join('s.milestone', 'm')
                    ->where('m.id = :milestone_id')
                    ->setParameter('milestone_id', $milestone_id)
                    ->getQuery();