具有相关实体的深层克隆学说实体

我创build了AOneToMany关系的实体A ,这个关系和OneToMany有关系。

我必须克隆这个A实体,并使用新的ID将其设置在数据库中。 所有深层次的关系也应该用新的ID进行克隆。

我试过什么是设置A ID为null

 $A = clone $A_original; $A->setId(null); $em->persist($A); 

它在A表中创build新logging,但不在BC

我应该怎样做A实体的完整副本?

您必须在您的实体中实现一个__clone()方法,将id设置为null,并根据需要__clone()关系。 因为如果你将id保存在相关对象中,它假定你的新实体A与现有实体BC有关系。

A克隆方法:

 public function __clone() { if ($this->id) { $this->setId(null); $this->B = clone $this->B; $this->C = clone $this->C; } } 

BC克隆方法:

 public function __clone() { if ($this->id) { $this->setId(null); } } 

https://groups.google.com/forum/?fromgroups=#!topic/doctrine-user/Nu2rayrDkgQ

https://doctrine-orm.readthedocs.org/en/latest/cookbook/implementing-wakeup-or-clone.html

根据coder4的评论,为A上的OneToMany关系创build一个克隆方法,其中$this->M是OneToMany,因此是一个ArrayCollection

 public function __clone() { if ($this->id) { $this->setId(null); // cloning the relation M which is a OneToMany $mClone = new ArrayCollection(); foreach ($this->M as $item) { $itemClone = clone $item; $itemClone->setA($this); $mClone->add($itemClone); } $this->M = $mClone; } } 

还有一个模块可以做到这个叫DeepCopy:

https://github.com/myclabs/DeepCopy

 $deepCopy = new DeepCopy(); $myCopy = $deepCopy->copy($myObject); 

您也可以添加filter来自定义复制过程。