Nehmen wir an, ich habe eine Entität $e
. Gibt es eine generische Möglichkeit, es als eine andere Zeile zu speichern, die dieselben Entitätsdaten, aber einen anderen Primärschlüssel enthält?
Warum ich das brauche: Ich implementiere eine Art temporäres Datenbankschema und anstatt die Zeile zu aktualisieren, muss ich nur ein neues erstellen.
$f = clone $e
? Möglicherweise müssen Sie die__clone()
Methode implementierenspl_object_hash
(Doctrine verwendet es, um bestimmte Instanzen zu identifizieren) sind für das Original und das geklonte Objekt gleich, obwohl sie unterschiedliche Daten enthalten__clone()
würde auch nicht helfen - Doctrine verwendet$oid = spl_object_hash($entity);
und eine interne Karte, um den Status des Objekts zu erhalten. Und für beide (das Original und das geklonte) wäre es das gleiche -MANAGED
Antworten:
Versuchen Sie das Klonen und fügen Sie Ihrer Entität die folgende Methode hinzu
public function __clone() { $this->id = null; }
Sie müssen möglicherweise trennen das Unternehmen , bevor es persistierenden. Ich habe meine Entwicklungsmaschine momentan nicht zur Hand, um dies zu testen.
$f = clone $e; $em->detach($f); $em->persist($f); $em->flush();
Aktualisieren
Ich habe gerade versucht, eine einfache SQLite-Demo zu verwenden. Sie sollten nichts tun müssen. Das Folgende funktionierte für mich, ohne eine
__clone()
Methode hinzuzufügen oder etwas Ungewöhnliches zu tun$new = clone $old; $em->persist($new); $em->flush();
Nach dem Löschen hatte die
$new
Entität eine neue ID und wurde als neue Zeile in der Datenbank gespeichert.Ich würde die ID-Eigenschaft immer noch über die
__clone()
Methode auf Null setzen , da dies aus einer reinen Modellansicht sinnvoll ist.Update 2
Dies liegt daran, dass die generierten Proxy-Klassen
__clone()
mit dieser wichtigen Zeile implementiert werdenunset($this->_entityPersister, $this->_identifier);
quelle
$em->refresh($old)
oder$em->detach($old)
scheinen zu funktionieren ...__clone()
möchten, stellen Sie sicher, dass Sie dies sicher tun, wie in der Dokumentation gezeigt. Andernfalls können Sie leicht Probleme verursachen.Ich mache einfach:
/** * __clone * * @return void */ public function __clone() { $this->id = null; }
Weitere Details finden Sie hier https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/cookbook/implementing-wakeup-or-clone.html
quelle
Hier ist eine einfache Strategie, die ich verwendet habe und die keine übermäßige Komplexität beinhaltet:
$new->fromArray( $old->toArray() ); $new->id = NULL;
quelle
fromArray
undtoArray
Methoden?Doctrine_Collection
Objekte?