![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 5 Dołączył: 10.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cześć.
Od niedawna bawię się Symfony2, do tej pory jakoś nie po drodze mi było z SF i pracowałem z innymi frameworkami (Zend, Yii). Mam problem z odwzorowaniem relacji 1-1 w encjach Doctrine. Mam 2 encje User i Profile. Każdy użytkownik może, ale nie musi mieć profilu. W tabeli Profile jako klucz główny i jednocześnie klucz obcy User zastosowałem pole 'uidx' (nie wydało mi się sensowne tworzenie osobnego klucza głównego AI w tabeli Profile, skoro i tak 1 User może mieć 1 Profile, gdzie id_usera=id_profilu). Teraz w czym problem. Główną tablicą w mojej bazie jest User. Chciałem to zrobić tak, że najpierw tworzę użytkownika, później mogę utworzyć mu profil na zasadzie: - pobierz istniejącego użytkownika - stwórz nowy obiekt Profile i wypełnij go danymi (np. z formularza ProfileType) - przypisz profil do użytkownika, np. $user->setProfile($profile) - zapisz całość do bazy. Okazuje się, że chyba jednak nie mogę. Próby utworzenia relacji $profile w encji User, a następnie wykonanie 'doctrine:schema:update --force' kończą się tym, że na klucz główny w tabeli User zakładany jest CONSTRAINT do Profile - możecie sobie wyobrazić jakie jaja, nie mogę utworzyć wtedy ani jednego ani drugiego (bo w Profile też jest CONSTRAINT do User)... Próbowałem kombinować z inversedBy oraz mappedBy, ale jak się pewnie domyślacie, bezskutecznie. Tak wygląda odwołanie do User w Profile:
Tak wygląda User:
O co mi chodzi? Chciałbym móc odwołać się np. w kontrolerze do profilu z poziomu użytkownika... nie mając jednocześnie założonego CONSTRAINT na uidx w User, czyli np:
Jest to w ogóle możliwe w SF? A może źle kombinuje i powinienem to inaczej zaprojektować/odwzorować? Czy dać sobie spokój i w UserRepository utworzyć zwykłego SQLa z JOIN, który pobierze mi profil np. getUserProfile() ? Ten post edytował r4nd4ll 16.05.2013, 10:11:14 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 5 Dołączył: 10.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Po zamieszczeniu encji User od razu jest wiadome, że zrobiłeś relację jednokierunkową, a chcesz z niej skorzystać jak z dwukierunkowej. Jak już to zmienisz to w encji User dla pola profile ustaw nullable. Wkleiłem to co przywróciłem, gdy próby z dwukierunkową relacją mnie zawiodły (jedyne co "jakoś" działało).. W encji Profile chcesz mieć klucz główny uidx z automatycznie generowaną wartością To Generated jakoś się tam zaplątało, oczywiście nie miał być automatycznie generowany, za to miał być odpowiednikiem uidx z User. Mniejsza z tym, dodałem osobny klucz glowny $profidx do Profile. Posiłkując się tym linkiem: http://docs.doctrine-project.org/projects/...e-bidirectional mam teraz tak:
I teraz:
Stwierdziłeś, że to co chcę osiągnąć jest możliwe, więc męczę się z tą przeklętą relacją już pół dnia i jestem niemalże tam gdzie byłem.. Będę wdzięczny jeśli chciałoby Ci się na to zerknąć jeszcze raz. /// EDIT Zmodyfikowałem metodę User setProfile:
I wygląda na to, że działa, w obie strony (IMG:style_emoticons/default/smile.gif) Pytanie tylko, czy takie podejście jest prawidłowe i nie mieszam tym za bardzo?? Ten post edytował r4nd4ll 16.05.2013, 17:50:52 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 21:11 |