![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 13.12.2016 Ostrzeżenie: (0%) ![]() ![]() |
Cześć, mam takie pytanie :
Potrzebuje sklonować/skopiować rekord w bazie danych za pomocą np. przycisku w aplikacji . W danym kontrolerze zrobiłem funckje private function cloneAction(Grid $grid) , tylko z racji, że nie jestem w tym biegły nie wiem jak wywołać ją na stronie żeby po przyciśnięciu przycisku dany rekord mi się skopiował. Zależy mi aby przycisk [kopiuj] pojawił się na wygenerowanej stronie np show.html.twig . Czy mógłby ktoś mi w tym pomóc, doradzić ? To kod jaki mam, czy w ogole on jest w porzadku ? EDIT: nalezy użyć metody __clone()? jesli tak to w jaki sposob ?
Ten post edytował wluczykuj 13.12.2016, 20:52:32 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
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.html Czyli jak mamy np. Menu gdzie będzie relacja do Url a w "cscade" ustawimy "detach" to:
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:
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 10:59 |