具有相关实体的深层克隆学说实体
我创build了A与OneToMany关系的实体A ,这个关系和OneToMany有关系。
我必须克隆这个A实体,并使用新的ID将其设置在数据库中。 所有深层次的关系也应该用新的ID进行克隆。
我试过什么是设置A ID为null :
$A = clone $A_original; $A->setId(null); $em->persist($A);
它在A表中创build新logging,但不在B和C 。
我应该怎样做A实体的完整副本?
您必须在您的实体中实现一个__clone()方法,将id设置为null,并根据需要__clone()关系。 因为如果你将id保存在相关对象中,它假定你的新实体A与现有实体B和C有关系。
A克隆方法:
public function __clone() { if ($this->id) { $this->setId(null); $this->B = clone $this->B; $this->C = clone $this->C; } }
B和C克隆方法:
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来自定义复制过程。