我有一个相当复杂的Doctrine关系架构,查询起来很头疼。它是这样写的:
项目 [OneToMany, Bidirectional]
里程碑
里程碑/strong> [OneToMany, Bidirectional]
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();