我正在面对Symfony和Doctrine的新问题。我有两个实体Entity1(ManyToOne)Entity2。在页面中,我有2种表单,一种是新创建的Entity1表单,另一种是Entity2的表单,它已经存在于数据库中。在每种情况下,我都想将Entity2附加到Entity1。当我想将一个已经存在的Entity2附加到Entity1时,我的问题出现了。 当我提交表单时,在数据库中我有2个条目,一个条目的entry1链接到已经存在的entity2(我想要的),另一个条目将相同的entity1链接到一个具有新标识的entry2的新实例。我不为什么会有这种行为。
首先是我的实体:
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()函数。我想念什么,显然做错了什么?
谢谢。
答案 0 :(得分:0)
为了解决这个问题,我将在评论部分描述@Jakumi提供的解决方案。 我的错误是我以错误的方式使用的merge()函数。我必须写:
$ent2 = $em->merge($ent2);
$ent1 = $em->merge($ent2->setDemandeur($ent1));
有了这些,我得到了一个新的entity1,它链接到现有的entity2。