sitio plugin otro migrar duplicator duplicar copiar con clonar doctrine2 symfony-2.1

doctrine2 - plugin - Entidad de Doctrine de clonación profunda con entidades relacionadas



migrar sitio web con duplicator (3)

No pude usar DeepClone (requiere php 7.1+), así que fundé una forma más simple de clonar relaciones en el método entity __clone

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

He creado una entidad A con relación OneToMany a B , que tienen relación OneToMany con C

Tengo que clonar esta entidad A y establecerla en la base de datos con una nueva identificación. También todas las relaciones profundas deberían clonarse con nuevos identificadores también.

Lo que he intentado es establecer A identificación para null :

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

Crea un nuevo registro en la tabla A , pero no en B y C

¿Qué debo hacer para hacer una copia completa de la entidad A ?


También hay un módulo que hará esto llamado DeepCopy:

https://github.com/myclabs/DeepCopy

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

También puede agregar filtros para personalizar el proceso de copia.


Tienes que implementar un método __clone() en tus entidades que establece el id en nulo y clona las relaciones si lo deseas. Porque si mantiene la identificación en el objeto relacionado, asume que su nueva entidad A tiene una relación con las entidades existentes B y C

Clonar-método para A :

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

Método de clonación para B y 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

Basado en el comentario de coder4show, un método de clonación para una relación OneToMany en A donde $this->M es OneToMany y, por lo tanto, una 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; } }