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