与现有实体的多对一关系
ManyToOne relation with existing entities
我在使用 Symfony 和 Doctrine 时遇到了一个新问题。我有两个实体 Entity1 (ManyToOne) Entity2。在一个页面中,我有 2 个表单,一个是新创建的 Entity1 表单,另一个是 Entity2 的另一个表单,它可能已经存在于数据库中。在每种情况下,我都想将 Entity2 附加到 Entity1。当我想将一个已经存在的 Entity2 附加到 Entity1 时,我的问题就来了。
当我提交表单时,在数据库中我有 2 个条目,一个 entity1 链接到已经存在的 entity2(我想要的),另一个将同一个 entity1 链接到具有新 id 的 entity2 的新实例。我不明白为什么我有这种行为。
首先是我的实体:
class Entity2
{
/**
*@var int
*
*@ORM\Id
*@ORM\GeneratedValue(strategy="AUTO")
*@ORM\Column(type="integer")
*/
private $id;
/**
*@var Collection|Entity1[]
*
*@ORM\OneToMany(targetEntity="Entity1", mappedBy="entity2", fetch="EXTRA_LAZY")
*
*/
private $entity1;
}
class Entity1
{
/**
*@var int
*
*@ORM\Id
*@ORM\GeneratedValue(strategy="AUTO")
*@ORM\Column(type="integer")
*/
private $id;
/**
*@var \Demandeur
*
*@ORM\ManyToOne(targetEntity="Entity2", inversedBy="entity1", cascade={"persist"})
*@ORM\JoinColumn(name="idEntity2", referencedColumnName="id")
*/
private $entity2;
}
最初,我在 OneToMany 上也有一个持续的级联,但我认为这是导致我的问题的原因。
现在我的控制器:
public function new(Request $request)
{
$ent1 = new Entity1();
$em = $this->getDoctrine()->getManager();
$formEnt1 = $this->createForm(Entity1Type::class);
$formEnt1->handleRequest($request);
$formEnt2 = $this->createForm(Entity2Type::class);
$formEnt2->handleRequest($request);
if($request->isMethod('POST')){
$ent1= $formEnt1->getData();
$ent2 = new Entity2();
$ent2 = $formEnt2->getData();
$id = $request->request->get['id'];
//if data already exist in database
if($id > 0) {
$ent2 ->setId($id);
$dem = $em->merge($ent2);
//attach the existing entity2 to entity1
$ent1Ent2 = $em->merge($ent1->setDemandeur($ent2));
}else{
//attach the new entity2 to entity1
$ent1->setEntity2($ent2 );
}
$em->persist($ent1);
$em->flush();
return ...
}
另外我不确定我是否正确使用了 merge() 函数。我错过了什么,显然做错了什么?
提前致谢。
为了解决这个问题,我会在评论区描述@Jakumi给出的解决方案。
我的错误是我以错误的方式使用了 merge() 函数。我不得不写:
$ent2 = $em->merge($ent2);
$ent1 = $em->merge($ent2->setDemandeur($ent1));
有了这些,我得到了一个链接到现有实体 2 的新实体 1。
我在使用 Symfony 和 Doctrine 时遇到了一个新问题。我有两个实体 Entity1 (ManyToOne) Entity2。在一个页面中,我有 2 个表单,一个是新创建的 Entity1 表单,另一个是 Entity2 的另一个表单,它可能已经存在于数据库中。在每种情况下,我都想将 Entity2 附加到 Entity1。当我想将一个已经存在的 Entity2 附加到 Entity1 时,我的问题就来了。 当我提交表单时,在数据库中我有 2 个条目,一个 entity1 链接到已经存在的 entity2(我想要的),另一个将同一个 entity1 链接到具有新 id 的 entity2 的新实例。我不明白为什么我有这种行为。
首先是我的实体:
class Entity2
{
/**
*@var int
*
*@ORM\Id
*@ORM\GeneratedValue(strategy="AUTO")
*@ORM\Column(type="integer")
*/
private $id;
/**
*@var Collection|Entity1[]
*
*@ORM\OneToMany(targetEntity="Entity1", mappedBy="entity2", fetch="EXTRA_LAZY")
*
*/
private $entity1;
}
class Entity1
{
/**
*@var int
*
*@ORM\Id
*@ORM\GeneratedValue(strategy="AUTO")
*@ORM\Column(type="integer")
*/
private $id;
/**
*@var \Demandeur
*
*@ORM\ManyToOne(targetEntity="Entity2", inversedBy="entity1", cascade={"persist"})
*@ORM\JoinColumn(name="idEntity2", referencedColumnName="id")
*/
private $entity2;
}
最初,我在 OneToMany 上也有一个持续的级联,但我认为这是导致我的问题的原因。 现在我的控制器:
public function new(Request $request)
{
$ent1 = new Entity1();
$em = $this->getDoctrine()->getManager();
$formEnt1 = $this->createForm(Entity1Type::class);
$formEnt1->handleRequest($request);
$formEnt2 = $this->createForm(Entity2Type::class);
$formEnt2->handleRequest($request);
if($request->isMethod('POST')){
$ent1= $formEnt1->getData();
$ent2 = new Entity2();
$ent2 = $formEnt2->getData();
$id = $request->request->get['id'];
//if data already exist in database
if($id > 0) {
$ent2 ->setId($id);
$dem = $em->merge($ent2);
//attach the existing entity2 to entity1
$ent1Ent2 = $em->merge($ent1->setDemandeur($ent2));
}else{
//attach the new entity2 to entity1
$ent1->setEntity2($ent2 );
}
$em->persist($ent1);
$em->flush();
return ...
}
另外我不确定我是否正确使用了 merge() 函数。我错过了什么,显然做错了什么?
提前致谢。
为了解决这个问题,我会在评论区描述@Jakumi给出的解决方案。 我的错误是我以错误的方式使用了 merge() 函数。我不得不写:
$ent2 = $em->merge($ent2);
$ent1 = $em->merge($ent2->setDemandeur($ent1));
有了这些,我得到了一个链接到现有实体 2 的新实体 1。