-->

与相关实体深克隆主义实体(Deep clone Doctrine entity with relat

2019-07-17 20:18发布

我已经创建了一个实体AOneToMany关系B ,其具有相对于OneToManyC

我需要重复这个A实体,并把它与新的ID数据库。 也都深深的关系应该与新的ID被克隆了。

有什么我想是设置A ID,以null

$A = clone $A_original;
$A->setId(null);
$em->persist($A);

它在创造新的纪录A表,但不BC

我应该怎么做才能让一个完全复制A实体?

Answer 1:

你必须实现一个__clone()在你的实体法,设置标识如果需要为null,克隆关系。 因为如果你保持ID与相关对象它假定你的新的实体A具有相对于现有的实体BC

用于克隆方法A

public function __clone() {
    if ($this->id) {
        $this->setId(null);
        $this->B = clone $this->B;
        $this->C = clone $this->C;
    }
}

用于克隆方法BC

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;
    }
}


Answer 2:

还有一个模块,将做到这叫做deepcopy的:

https://github.com/myclabs/DeepCopy

$deepCopy = new DeepCopy();
$myCopy   = $deepCopy->copy($myObject);

您还可以添加过滤器自定义复制过程。



Answer 3:

我不是能够使用DeepClone(它需要PHP 7.1+),所以我创办了更简单的方法来克隆实体__clone方法的关系

$this->tags = new ArrayCollection($this->tags->toArray());


文章来源: Deep clone Doctrine entity with related entities