我需要为我的实体创建关系,我有以下场景:
实体A - 与实体B的OneToMany关系 实体B - 与实体C的OneToMany关系
在实体A上执行“查找”时,ORM会自动查询所有匹配的实体B行。我不清楚的是ORM是否会自动查询所有匹配的实体C行。
$em = $this->getDoctrine()->getEntityManager();
$project = $em->getRepository('MyAppMainBundle:Project')->find($id);
$client = $project->getClient();
$clientProjects = $client->getClientProjects();
如果可能出现这种情况,那么实施它的最佳做法是什么?
谢谢,
JB
更新
我实际上已经想出了如何使用映射关系来做到这一点。关键是在实体中设置映射,以便实体B依次正确映射到实体C.请参阅答案。
答案 0 :(得分:2)
只需正确映射关系,您就可以进行设置。看起来你想要OneToMany / ManyToOne。
答案 1 :(得分:1)
以下是我解决问题的方法:
Parent Entity 'Client':
/**
* @ORM\OneToMany(targetEntity="ClientProject", mappedBy="client")
*/
private $clientProjects;
儿童实体'ClientProject':
/**
* @ORM\ManyToOne(targetEntity="Client", inversedBy="ClientProject")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id")
*/
private $client;
然后,控制器可以使用以下代码:
$em = $this->getDoctrine()->getEntityManager();
$project = $em->getRepository('MyAppMainBundle:Project')->find($id);
$client = $project->getClient();
$clientProjects = $client->getClientProjects();
foreach ($clientProjects as $clientProject) {
echo $clientProject->getSomeProperty();
}
答案 2 :(得分:0)
如果你想在一个请求中获取所有实体,最好创建自定义存储库类,并使用QueryBuilder进行A连接B连接C的查询。在其他情况下,结果将取决于LAZY_FETCH选项,AFAIR < / p>