我已经创建了一个实体A
与OneToMany
关系B
,其具有相对于OneToMany
到C
。
我需要重复这个A
实体,并把它与新的ID数据库。 也都深深的关系应该与新的ID被克隆了。
有什么我想是设置A
ID,以null
:
$A = clone $A_original;
$A->setId(null);
$em->persist($A);
它在创造新的纪录A
表,但不B
和C
。
我应该怎么做才能让一个完全复制A
实体?
我已经创建了一个实体A
与OneToMany
关系B
,其具有相对于OneToMany
到C
。
我需要重复这个A
实体,并把它与新的ID数据库。 也都深深的关系应该与新的ID被克隆了。
有什么我想是设置A
ID,以null
:
$A = clone $A_original;
$A->setId(null);
$em->persist($A);
它在创造新的纪录A
表,但不B
和C
。
我应该怎么做才能让一个完全复制A
实体?
你必须实现一个__clone()
在你的实体法,设置标识如果需要为null,克隆关系。 因为如果你保持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
基于所述评论coder4show用于在一对多关系的克隆方法A
其中$this->M
是一对多,因此一个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);
您还可以添加过滤器自定义复制过程。
我不是能够使用DeepClone(它需要PHP 7.1+),所以我创办了更简单的方法来克隆实体__clone方法的关系
$this->tags = new ArrayCollection($this->tags->toArray());