【问题标题】:Symfony2: Handling multiple ORM relationshipsSymfony2:处理多个 ORM 关系
【发布时间】:2012-06-27 19:46:15
【问题描述】:

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

实体 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。查看答案。

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

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

    【讨论】:

    • 是的,我认为我需要做的。我在下面发布了解决方案。
    【解决方案2】:

    这是我解决问题的方法:

    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();
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您的意见,Ziumin!虽然这当然可以通过在存储库类中创建自定义方法来完成,但目标是使用 ORM 的内置功能来设置它。我在挖掘更多之后发现了它,它似乎正在工作。
      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      相关资源
      最近更新 更多