2010-09-23 10 views
5

Czy istnieje sposób ładowania urządzeń z odwołaniem kołowym? Jako przykład mam następujące urządzenie:Oprawy doktrynalne - okrągłe odnośniki

BusinessEntityTeam: 
    Nicole_Team: 
    name: Nicole's Team 
    Manager: [Nicole] 
    Business: [ACMEWidgets] 

sfGuardUser 
    Nicole: 
    first_name:  Nicole 
    last_name:  Jones 
    email_address: [email protected] 
    username:  nicole 
    password:  nicole 
    Groups:   [Group_abc] 
    Team:   [Nicole_Team] 

Jak widać, Nicole_Team odwołuje Nicole ... ale Nicole odwołuje się również Nicole_Team.

Gdy Menedżer nie był wymaganą kolumną, było to OK (urządzenie zostało załadowane, ale Menedżer miał wartość NULL), ale teraz jest wymagane, aby załadować urządzenie.

Jedyne obejście, jakie widzę, to umieszczenie relacji zespołu w jej własnym obiekcie (np. "Profil"), więc relacje nie są już okrągłe.

Czy istnieje inne podejście? Każdy użytkownik musi być w zespole, ale tylko kilku użytkowników to menedżerowie zespołu. Jestem całkiem otwarty na to, że mój model danych może być źle zaprojektowany i mieć miejsce na ulepszenia.

Odpowiedz

1

Jak o tym:

BusinessEntityTeam: 
    Nicole_Team: 
    name: Nicole's Team 
    Business: [ACMEWidgets] 

sfGuardUser 
    Nicole: 
    first_name:  Nicole 
    last_name:  Jones 
    email_address: [email protected] 
    username:  nicole 
    password:  nicole 
    Groups:   [Group_abc] 
    Team:   [Nicole_Team] 
    ManagerFor:  [Nicole_Team] 

W celu uniknięcia okrągły odniesienie, trzeba umieścić stosunków w jednym modelu.

+0

Dzięki za odpowiedź. Próbowałem tego, dodając dwukierunkową relację między BusinessEntityTeam i sfGuardUser w celu odniesienia do referencji. Urządzenie wczytuje się bez zgłaszania błędu, ale wartość jest nadal NULL – PeterB

+0

Dlaczego dodałeś dwukierunkową relację? To, co zrobiłem, to uniknąć takiego związku. Jeśli chcesz poznać kierownika zespołu, musisz napisać metodę w swoim modelu drużyny. takie jak funkcja getManager() i implementuj metodę samodzielnie. Sql powinno być coś w stylu "wybierz top 1 od użytkownika u gdzie u.manager_for =?" –

+0

Popełniłem błąd. Nie musisz samodzielnie pisać metody getManager(). Nie musisz też dodawać dwukierunkowej relacji. Relacje są automatycznie dwukierunkowe. Na przykład, dodajesz relację od użytkownika do zespołu, a następnie masz dwie metody: user-> getTeam() i team-> getUsers() automatycznie. Dla przykładu: będą dwie metody: user-> getManagedTeam() i team-> getManager(). Muszę przeczytać plik schema.xml, aby przekazać więcej szczegółów. –