Я использую 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), я думаю, что очень дорогой запрос, который доктрина оправдывает