2010-09-23 26 views
5

Est-il possible de charger les appareils qui ont référence circulaire? À titre d'exemple, j'ai l'appareil suivant:Doctrine - références circulaires

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] 

Comme vous pouvez le voir, Nicole_Team références Nicole ... mais Nicole références aussi Nicole_Team.

Lorsque le Gestionnaire n'a pas été une colonne nécessaire, c'était OK (chargé l'appareil, mais le directeur était NULL), mais maintenant il est nécessaire, il est impossible de charger l'appareil.

Le seul travail autour que je peux voir est de mettre la relation de l'équipe dans son propre objet (« Profil », par exemple) pour que les relations ne sont plus circulaires.

Y at-il autre approche? Chaque utilisateur doit faire partie d'une équipe, mais seuls quelques utilisateurs sont des chefs d'équipe. Je suis tout à fait ouvert au fait que mon modèle de données peut être mal conçu et faire l'objet d'améliorations.

Répondre

1

Que diriez-vous ceci:

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] 

Afin d'éviter le référencement circulaire, vous devez mettre les relations dans un modèle.

+0

Merci pour votre réponse. J'ai essayé ceci, en ajoutant une relation bidirectionnelle entre BusinessEntityTeam et sfGuardUser afin d'avoir une relation à référence. Les charges de fixation sans erreur étant jetés, mais la valeur est toujours NULL – PeterB

+0

Pourquoi avez-vous ajouté une relation bidirectionnelle? Ce que j'ai fait est d'éviter une telle relation. Si vous voulez connaître le manager d'une équipe, vous devez écrire une méthode dans votre modèle d'équipe. comme la fonction getManager() et implémentez la méthode vous-même. Le sql devrait être quelque chose comme "sélectionner le premier utilisateur de l'utilisateur u où u.manager_for =?" –

+0

J'ai fait une erreur. Vous n'avez pas besoin d'écrire une méthode getManager() vous-même. Et vous n'avez pas non plus besoin d'ajouter une relation bidirectionnelle. Les relations sont automatiquement bidirectionnelles. Par exemple, vous ajoutez une relation de l'utilisateur à l'équipe, puis vous avez deux méthodes: user-> getTeam() et team-> getUsers() automatiquement. Pour votre exemple: il y aura deux méthodes user-> getManagedTeam() et team-> getManager(). Je dois lire votre schema.xml pour vous dire plus de détails. –