与现有实体的ManyToOne关系

时间:2019-08-01 12:58:18

标签: symfony doctrine symfony4

我正在面对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()函数。我想念什么,显然做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我将在评论部分描述@Jakumi提供的解决方案。 我的错误是我以错误的方式使用的merge()函数。我必须写:

$ent2 = $em->merge($ent2);
$ent1 = $em->merge($ent2->setDemandeur($ent1));

有了这些,我得到了一个新的entity1,它链接到现有的entity2。