Deep-Copy auf ein Doctrine Entity

Um ein Doctrine-Entity zu kopieren und neu zu speichern, sodaß man 2 Zeilen mit den gleichen Daten aber neuer ID in der Datenbank-Tabelle hat, genügt im Normalfall ein einfaches clone auf das Entity. Hat man im Entity aber Beziehungen zu anderen Entities gespeichert, werden diese nicht mitkopiert. Dazu muß man die „magische Funktion“ __clone im Entity erweitern:

Als Beispiel folgende Entities:

Wollen wir nun den Warenkorb nocheinmal abspeichern, würde mit einem einfachen clone zwar eine Kopie des Warenkorbs entstehen, aber nicht von den einzelnen Einträgen. Wir müssen deshalb die Basket-Entity um eine __clone-Funktion erweitern und dort die Warenkorb-Positionen einzeln kopieren:

Um nun einen Warenkorb zu kopieren und neu zu speichern, müssen wir z.B. im Entity-Repository von Basket folgendes durchführen:

Ein Hinweis: Doctrine´s EntityManager hat zwar eine Methode copy, welche laut Dokumentation ein DeepCopy können sollte, aber diese Methode ist (noch) nicht implementiert:

http://www.doctrine-project.org/api/orm/2.5/source-class-Doctrine.ORM.EntityManager.html#676-685