具有相关实体的深层克隆学说实体
我创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来自定义复制过程。