Doctrine orm 深度克隆原则实体与相关实体
我已经创建了一个实体Doctrine orm 深度克隆原则实体与相关实体,doctrine-orm,symfony-2.1,Doctrine Orm,Symfony 2.1,我已经创建了一个实体A,该实体与OneToMany关系为B,与OneToMany关系为C 我必须克隆这个A实体,并用新id在数据库中设置它。同时,所有深层关系也应该用新id克隆 我尝试的是将Aid设置为null: $A = clone $A_original; $A->setId(null); $em->persist($A); 它在A表中创建新记录,但不在B和C中创建新记录 我应该如何制作实体的完整副本? 您必须在实体中实现一个\u clone()方法,该方法将id设置为null
A
,该实体与OneToMany
关系为B
,与OneToMany
关系为C
我必须克隆这个A
实体,并用新id在数据库中设置它。同时,所有深层关系也应该用新id克隆
我尝试的是将A
id设置为null
:
$A = clone $A_original;
$A->setId(null);
$em->persist($A);
它在A
表中创建新记录,但不在B
和C
中创建新记录
我应该如何制作实体的完整副本?
您必须在实体中实现一个\u clone()
方法,该方法将id设置为null,并根据需要克隆关系。因为如果将id保留在相关对象中,它会假定新实体A
与现有实体B
和C
存在关系
A的克隆方法
:
public函数{
如果($this->id){
$this->setId(空);
$this->B=克隆$this->B;
$this->C=克隆$this->C;
}
}
B
和C
的克隆方法:
public函数{
如果($this->id){
$this->setId(空);
}
}
根据Coder4的注释,在a
上显示一个OneToMany关系的克隆方法,其中$this->M
是OneToMany,因此是数组集合
:
public函数{
如果($this->id){
$this->setId(空);
//克隆关系M,它是一个单间
$mClone=新的ArrayCollection();
foreach($this->M as$item){
$itemClone=clone$item;
$itemClone->setA($this);
$mClone->add($itemClone);
}
$this->M=$mClone;
}
}
还有一个名为DeepCopy的模块:
您还可以添加过滤器来自定义复制过程。我无法使用DeepClone(它需要PHP7.1+),因此我在entity\u clone方法中找到了更简单的克隆关系的方法
$this->tags = new ArrayCollection($this->tags->toArray());
嗨@Ben你能看一下我发现了这辆难以置信的马车,而且你自己的
克隆methods@coder4show这是因为您正在克隆ArrayCollection
,而不是其中的元素。我为OneToMany关系添加了克隆方法。在本例中,OneToMany关系将无法正确克隆,因为克隆的相关实体仍然引用旧实体。看一看有没有工作经验example@Richard谢谢,你说得对。我已经更新了这个示例,使其能够工作。使用$this->setId(null)有什么特别的原因吗
而不是$this->id=null
?@PierredeLESPINAY如果您有一个setter,我建议您使用它,因为在更改id时可能会触发其中的一些其他逻辑。除此之外,我看不到使用setter的特殊原因。对于克隆,它应该有同样的效果。太好了!它起作用了。我正在使用iterable,所以它看起来像:$this->foos=\iterable\u to\u数组($this->foos)代码>
$this->tags = new ArrayCollection($this->tags->toArray());