0

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

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

4

3 回答 3

2

只需正确映射关系,您就可以设置。看起来你想要一个 OneToMany/ManyToOne。

于 2012-06-27T23:17:46.277 回答
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();
}
于 2012-06-27T23:18:16.643 回答
0

如果您希望在单个请求中获取所有实体,最好创建自定义存储库类并使用 QueryBuilder 在 A 连接 B 连接 C 的位置进行查询。在其他情况下,结果将取决于 LAZY_FETCH 选项,AFAIR

于 2012-06-27T19:54:37.510 回答