Другой способ обновить отношения OneToMany в доктрине в рамках Symfony - PullRequest
0 голосов
/ 26 марта 2019

Я использую symfony 3.4 и doctrineORM 2.5, у меня есть объект с именем Project, который содержит отношение OneToMany к другому объекту с именем Opportunity

Таким образом, в пользовательском интерфейсе редактирования формы объекта Project у меня есть несколько вариантов выбора, пользователь может выбрать или отменить выбор любой возможности в этом списке.

Когда я отправляю форму в 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;
}

Мое решение состоит в том, чтобы сбрасывать отношения каждый раз, когда кто-то редактирует проект, например так:

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

Это решение работает очень хорошо, но есть лучший способ обновить это отношение, потому что иногда у меня очень много возможностей со стороны владельца (Project), я думаю, что очень дорогой запрос, который доктрина оправдывает

...