1. Nie trzeba klonować. Poza tym to jest słabe, bo nie klonuje ani dzieci, ani tym bardziej relacji, czyli jak masz obiekt A a pod nim B i C gdzie B ma relację do C, to sklonowany obiekt A2 nie będzie zawierał B2 i C2, tylko B i C. Do tego problemy z wydajnością (obiekty bazy danych są zazwyczaj dość rozległe) czy stabilnością (jeden rekord w bazie to powinien być jeden obiekt).
2. Kopiując encję musimy mieć na uwadze dwie rzeczy:
- które obiekty chcemy powielić a które nie
- które relacje chcemy podmienić a które nie
Przykład: obiekt A składa się z B i C, przy czym B ma relację do C. Zalożenia:
- powielamy A, B i C na A2, B2 i C2
- relacja w B2 wciąż wskazuje na C, więc zmieniamy to relację na C2
Czyli będą dwa etapy:
1. Powielanie wybranych obiektów
2. Zmiana relacji w wybranych obiektach
Etap pierwszy możemy zautomatyzować korzystając z kaskadowości:
http://docs.doctrine-project.org/projects/...sociations.htmlCzyli jak mamy np. Menu gdzie będzie relacja do Url a w "cscade" ustawimy "detach" to:
$entityManager->detach($menu);
Spowoduje, że zarówno Menu, jak i Url będą jakby "odłączone" od bazy, nie są one już obiektowymi odpowiednikami rekordów w bazie lecz "zwykłymi" obiektami i próba ich np. flushowania zwróci exception.
Można natomiast:
$entityManager->persist($menu);
I teraz znów, możemy ustawić kaskadowość tak, żeby Url został dodany od razu z Menu
Natomiast etap drugi musimy zrobić ręcznie, czyli dotrzeć do odpowiednich obiektów i wywołać odpowiednie settery.