2010-09-23 9 views
5

Gibt es eine Möglichkeit, Fixtures mit Zirkelreferenzierung zu laden? Als Beispiel habe ich die folgende Befestigung haben:Doktrinhalterungen - Zirkelreferenzen

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] 

Wie Sie sehen können, verweist Nicole_Team Nicole ... aber Nicole verweist auch Nicole_Team.

Wenn Manager keine erforderliche Spalte war, war das OK (das Gerät geladen, aber Manager war NULL), aber jetzt ist es erforderlich, das Gerät zu laden ist nicht möglich.

Die einzige Problemumgehung, die ich sehen kann, ist, die Team-Beziehung in ein eigenes Objekt zu bringen (zum Beispiel 'Profil'), so dass die Beziehungen nicht mehr kreisförmig sind.

Gibt es einen anderen Ansatz? Jeder Benutzer muss in einem Team sein, aber nur wenige Benutzer sind Teammanager. Ich bin ziemlich offen für die Tatsache, dass mein Datenmodell schlecht entworfen und verbesserungsfähig ist.

Antwort

1

Wie wäre es damit:

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] 

Um Kreis Referenzierung zu vermeiden, müssen Sie die Beziehungen in einem Modell setzen.

+0

Danke für Ihre Antwort. Ich habe dies versucht und eine bidirektionale Beziehung zwischen BusinessEntityTeam und sfGuardUser hinzugefügt, um eine Beziehung zur Referenz zu haben. Das Fixture wird geladen, ohne dass ein Fehler ausgelöst wird, aber der Wert ist immer noch NULL – PeterB

+0

Warum haben Sie eine bidirektionale Beziehung hinzugefügt? Was ich getan habe, ist eine solche Beziehung zu vermeiden. Wenn Sie den Manager eines Teams kennenlernen möchten, müssen Sie eine Methode in Ihr Teammodell schreiben. wie die Funktion getManager() und implementieren Sie die Methode selbst. Die SQL sollte so etwas wie "Wählen Sie Top 1 von Benutzer u, wo u.manager_for =?" –

+0

Ich habe einen Fehler gemacht. Sie müssen keine getManager() -Methode selbst schreiben. Außerdem müssen Sie keine bidirektionale Beziehung hinzufügen. Die Beziehung ist automatisch bidirektional. Wenn Sie beispielsweise eine Beziehung von Benutzer zu Team hinzufügen, haben Sie zwei Methoden: user-> getTeam() und team-> getUsers(). Für Ihr Beispiel: Es gibt zwei Methoden: user-> getManagedTeam() und team-> getManager(). Ich muss Ihre schema.xml lesen, um mehr Details zu erfahren. –