Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF][SF2] Relacja One-to-one - problem
r4nd4ll
post
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:

  1. /**
  2.  * Profile
  3.  *
  4.  * @ORM\Table(name="Profile")
  5.  * @ORM\Entity
  6.  */
  7. class Profile
  8. {
  9. /**
  10.   * @ORM\Column(name="uidx", type="integer", nullable=false)
  11.   * @ORM\Id
  12.   * @ORM\GeneratedValue(strategy="IDENTITY")
  13.   */
  14. private $uidx;
  15.  
  16. .... inne pola ...
  17.  
  18. /**
  19.   * @ORM\OneToOne(targetEntity="\SP\UserBundle\Entity\User", cascade={"persist"})
  20.   * @ORM\JoinColumn(name="uidx", referencedColumnName="uidx")
  21.   */
  22. private $user;
  23.  
  24. ... settery i gettery ...
  25.  
  26. /**
  27.   * Set user
  28.   *
  29.   * @param \SP\UserBundle\Entity\User $user
  30.   * @return Profile
  31.   */
  32. public function setUser(\SP\UserBundle\Entity\User $user)
  33. {
  34. $this->user = $user;
  35.  
  36. return $this;
  37. }
  38.  
  39. /**
  40.   * Get user
  41.   *
  42.   * @return \SP\UserBundle\Entity\User
  43.   */
  44. public function getUser()
  45. {
  46. return $this->user;
  47. }
  48. }


Tak wygląda User:
  1. /**
  2.  * User
  3.  *
  4.  * @ORM\Table(name="User")
  5.  * @ORM\Entity
  6.  * @UniqueEntity(fields="email", groups={"register"})
  7.  */
  8. class User implements AdvancedUserInterface, \Serializable
  9. {
  10. /**
  11.   * @var integer
  12.   *
  13.   * @ORM\Column(name="uidx", type="integer", nullable=false)
  14.   * @ORM\Id
  15.   * @ORM\GeneratedValue(strategy="IDENTITY")
  16.   */
  17. private $uidx;
  18.  
  19. ... inne pola ...
  20. ... gettery i settery ...
  21. }


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:

  1. $user = ...pobieram użytkownika;
  2. $profile = $user->getProfile();
  3.  
  4. echo $profile->getName();


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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.09.2025 - 16:45