在symfony框架中更新教义的一对多关系的其他方法

时间:2019-03-26 11:28:30

标签: php symfony doctrine

我使用symfony 3.4和doctrineORM 2.5,我有一个名为Project的实体,其中包含与另一个名为Opportunity的实体的OneToMany关系

因此,在项目实体的表单编辑UI中,我可以选择多个机会,用户可以选择或取消选择此列表中的任何机会。

当我将表单提交给ProjectController ---> editAction教义时,会自动使用新选择的值更新机会的ArrayCollection,这很好:),但是在持久化Project对象教义后,该用户并没有从多选列表中取消选择。

class Project{
    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="Module\CRMBundle\Entity\Opportunity", mappedBy="project")
     */
    private $opportunities;
}

class Opportunity{
    /**
     * @var Project
     * @ORM\ManyToOne(targetEntity="Module\CRMBundle\Entity\Project", inversedBy="opportunities")
     * @ORM\JoinColumn(name="project_code", referencedColumnName="code")
     */
    private $project;
}

我的解决方案是每次有人编辑Project时重置关系:

public function editAction(Request $request, Project $project){
        $form = $this->createForm('Module\CRMBundle\Form\ProjectType', $project);
        $form->handleRequest($request);
        $em = $this->getDoctrine()->getManager();

//Get all old opportunities of this project and set their project to null
        $oldOpportunities = $em->getRepository('CRMBundle:Opportunity')->findBy(array(
            'project' => $project
        ));
        foreach ($oldOpportunities as $opportunity){
            $opportunity->setProject(null);
            $em->persist($opportunity);
        }
//If request is comming we set this project to whole opportunities
        if ($request->isMethod('POST')) {
            foreach ($project->getOpportunities() as $opportunity){
                $opportunity->setProject($project);
            }
        }

        $em->persist($project);
        $em->flush();
}

此解决方案效果很好,但是有一种更新这种关系的最佳方法,因为有时从拥有方(项目)那里我有很多机会,我认为该学说将使执行成本很高。

0 个答案:

没有答案