Symfony2:处理多个ORM关系

时间:2012-06-27 19:46:15

标签: php symfony doctrine-orm

我需要为我的实体创建关系,我有以下场景:

实体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.请参阅答案。

3 个答案:

答案 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>