与现有实体的多对一关系

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。