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());