2010-09-23 6 views
5

Esiste un modo per caricare proiettori con riferimenti circolari? Per fare un esempio ho il seguente dispositivo:Infissi di dottrina - riferimenti circolari

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] 

Come si può vedere, Nicole_Team fa riferimento Nicole ... ma Nicole fa riferimento anche Nicole_Team.

Quando Manager non era una colonna richiesta, ciò era OK (il dispositivo è stato caricato, ma Manager era NULL), ma ora è richiesto che sia impossibile caricare l'apparecchiatura.

L'unica soluzione che riesco a vedere è mettere la relazione di squadra nel proprio oggetto ('Profilo' ad esempio) in modo che le relazioni non siano più circolari.

C'è qualche altro approccio? Ogni utente deve essere in una squadra, ma solo pochi utenti sono team manager. Sono abbastanza aperto al fatto che il mio modello di dati possa essere mal progettato e avere margini di miglioramento.

risposta

1

ne dite di questo:

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] 

Al fine di evitare riferimenti circolari, bisogna mettere i rapporti in un unico modello.

+0

Grazie per la risposta. Ho provato questo, aggiungendo una relazione bidirezionale tra BusinessEntityTeam e sfGuardUser al fine di avere una relazione di riferimento. L'apparecchiatura viene caricata senza generare alcun errore, ma il valore è ancora NULL – PeterB

+0

Perché hai aggiunto una relazione bidirezionale? Quello che ho fatto è di evitare una simile relazione. Se vuoi conoscere il manager di un team, dovresti scrivere un metodo nel tuo modello di squadra. come la funzione getManager() e implementare il metodo da soli. Il file sql dovrebbe essere qualcosa del tipo "seleziona il primo 1 di user u dove u.manager_for =?" –

+0

Ho fatto un errore. Non è necessario scrivere autonomamente un metodo getManager(). E non è necessario aggiungere una relazione bidirezionale. La relazione è automaticamente bidirezionale. Ad esempio, aggiungi una relazione da Utente a Team, quindi hai due metodi: user-> getTeam() e team-> getUsers() automaticamente. Per il tuo esempio: ci saranno due metodi user-> getManagedTeam() e team-> getManager(). Devo leggere il tuo schema.xml per dirti maggiori dettagli. –