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