[SF2][Symfony2][Symfony] Zapis encji w relacji, Zapis z poziomu kontrolera |
[SF2][Symfony2][Symfony] Zapis encji w relacji, Zapis z poziomu kontrolera |
23.03.2016, 09:24:15
Post
#1
|
|
Grupa: Zarejestrowani Postów: 493 Pomógł: 2 Dołączył: 15.07.2011 Skąd: Katowice Ostrzeżenie: (0%) |
Czemu ponizszy zapis danych do bazy nie dziala ?
Blad ktory otrzymyje jest nastepujacy:
Relacje miedzy encja Type i Match mam taka:
|
|
|
23.03.2016, 10:13:40
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
Szybkie pytanie: co jest niezrozumiałe w treści wyjątku, który podaje Ci dwa możliwe rozwiązania problemu?
|
|
|
23.03.2016, 10:41:06
Post
#3
|
|
Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) |
szybka odpowiedz $em->persist($match) przed flushem powinno pomóc. btw: nie rób tego w kontrolerze.
|
|
|
23.03.2016, 11:39:34
Post
#4
|
|
Grupa: Zarejestrowani Postów: 493 Pomógł: 2 Dołączył: 15.07.2011 Skąd: Katowice Ostrzeżenie: (0%) |
Ok, dodalem:
i udalo sie ... faktycznie nie doczytalem komunikatu, ktory przeciez jasno pisal co trzeba zrobic. ale nie wiem czemu do bazy nie zostal dodany rekord do tabeli Type o match_id = 3 tylko o match_id = 41 (zainkrementowalo mi match_id ) a wskazalem przeciez w kodzie ze ma zostac dodany rekord z match_id = 3 :
|
|
|
23.03.2016, 11:48:01
Post
#5
|
|
Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) |
get to nie set.
Ale jesli ten match juz istnieje w bazie to chyba powinienes go pobrac
Ten post edytował kapslokk 23.03.2016, 11:50:22 |
|
|
23.03.2016, 11:49:32
Post
#6
|
|
Grupa: Zarejestrowani Postów: 618 Pomógł: 143 Dołączył: 22.12.2010 Ostrzeżenie: (0%) |
Szybkie pytanie: co jest niezrozumiałe w treści wyjątku, który podaje Ci dwa możliwe rozwiązania problemu? Podpowiadam Kod To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
|
|
|
23.03.2016, 11:51:37
Post
#7
|
|
Grupa: Zarejestrowani Postów: 493 Pomógł: 2 Dołączył: 15.07.2011 Skąd: Katowice Ostrzeżenie: (0%) |
nie ma takiej metody w mojej encji Match jak setId()
to chyba nie tak sie robi ... Tak - takie $match o ID = 3 juz istnieje dlatego chcialem pobrac getId() rozumiem ze musze to zrobic tak:
i nie ma innej drogi zastanawia mnie tylko dlaczego kolega wczesniej prosil/ostrzegal zeby zapisu nie robic w konrolerze ... rozumiem ze chodzi o ograniczenie linii kodu ? Ten post edytował damianooo 23.03.2016, 11:56:00 |
|
|
23.03.2016, 12:00:43
Post
#8
|
|
Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) |
No bo tak jak Ci napisałem, nie powinieneś tego ustawiać ręcznie tylko pobrać z bazy istniejący rekord / zdać się na auto_increment;
getId() jak i cała reszta getterów służy do pobrania wartości z konkretnego obiektu, a nie obiektu z bazy na podstawie tej wartości. Cytat zastanawia mnie tylko dlaczego kolega wczesniej prosil/ostrzegal zeby zapisu nie robic w konrolerze smile.gif ... rozumiem ze chodzi o ograniczenie linii kodu ? Nie mam pojęcia, ktoś mądrzejszy sie musi wypowiedzieć. |
|
|
23.03.2016, 12:54:26
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
Cytat ale nie wiem czemu do bazy nie zostal dodany rekord do tabeli Type o match_id = 3 tylko o match_id = 41 (zainkrementowalo mi match_id ) Zapewne dla właściwości @Id masz ustawione automatyczne generowanie wartości (@GeneratedValue(AUTO)). Wtedy Doctrine zignoruje ręcznie ustawioną wartość przez setId(x).Cytat nie ma takiej metody w mojej encji Match jak setId() Jeżeli decydujesz się na ręczne bądź półautomatyczne (np. przy pomocy sekwencji) nadawanie ID-ków, to taką metodę setId() jak najbardziej możesz czy wręcz musisz mieć. Generalnie nawet jeżeli ID-ki generowane są wyłącznie przez bazę danych metoda setId() wiele nie wadzi, a przy pisaniu testów może się przydać.to chyba nie tak sie robi ... Cytat zastanawia mnie tylko dlaczego kolega wczesniej prosil/ostrzegal zeby zapisu nie robic w konrolerze (IMG:style_emoticons/default/smile.gif) ... rozumiem ze chodzi o ograniczenie linii kodu ? Liczba linii kodu jest bez znaczenia. Chodzi po prostu o to, że kontroler to nie miejsce dla ORM-a, który raczej powinien być użyty dopiero gdzieś głęboko w warstwie przetwarzania danych, czy właściwie dostępu do danych. Ale nie zawsze potrzebujemy takiej separacji kodu, na różne warstwy stąd Symfony udostępnia "łatwy" dostęp do Doctrine'a wewnątrz kontrolerów dziedziczących po Symfony\Bundle\FrameworkBundle\Controller\Controller.
|
|
|
23.03.2016, 13:19:09
Post
#10
|
|
Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) |
podpowiem: przypuśćmy, że chcesz dokładnie te samą operację wykonać w symfonowym commandzie. naturalnie, skopiujesz i przekleisz ten kod. co lepsi nawet rejestrują kontroler jako serwis i wywołują te akcje. Ale zawartość akcji Twojego kontrolera jest aplikacją samą w sobie, można jej fragment wydzielić i po prostu użyc: w kontrolerze, w commandzie, a co najwazniejsze - w teście
ps. spróbuj przetestować np. jednostkowo te akcje kontrolera. ps2. bo testujesz, prawda? ps3. przypuścmy sytuację, że pojawia się nowa niekompatybilna wstecz wersja frameworka LUB chcesz zmienić framework. Też kapa przy Twoim podejściu Generalnie: jest wiele powodów, żeby tak nie robić, niewiele powodów by tak robić Ten post edytował uirapuru 23.03.2016, 13:20:54 |
|
|
23.03.2016, 13:43:19
Post
#11
|
|
Grupa: Zarejestrowani Postów: 493 Pomógł: 2 Dołączył: 15.07.2011 Skąd: Katowice Ostrzeżenie: (0%) |
ok dzieki za uwagi ... przemysle to sobie ... chce to robic dobrze wiec bede o tych uwagach pamietal.
Pozdrawiam |
|
|
Wersja Lo-Fi | Aktualny czas: 18.04.2024 - 07:45 |