2010-09-23 21 views
5

¿Hay alguna forma de cargar dispositivos que tengan referencias circulares? A modo de ejemplo tengo el siguiente aparato:Accesorios Doctrine - referencias circulares

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] 

Como se puede ver, Nicole_Team hace referencia a Nicole ... pero también hace referencia a Nicole Nicole_Team.

Cuando el Administrador no era una columna obligatoria, esto estaba bien (el dispositivo estaba cargado, pero el Administrador era NULO), pero ahora se requiere que sea imposible cargar el dispositivo.

La única solución alternativa que puedo ver es poner la relación de equipo en su propio objeto ('Perfil' por ejemplo) para que las relaciones ya no sean circulares.

¿Hay algún otro enfoque? Cada usuario debe formar parte de un equipo, pero solo unos pocos son gerentes de equipo. Estoy bastante abierto al hecho de que mi modelo de datos puede estar mal diseñado y puede mejorarse.

Respuesta

1

¿Qué tal esto:

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] 

Con el fin de evitar referencias circulares, usted tiene que poner las relaciones en un solo modelo.

+0

Gracias por su respuesta. Intenté esto, agregando una relación bidireccional entre BusinessEntityTeam y sfGuardUser para tener una relación con la referencia. El dispositivo se carga sin error, pero el valor sigue siendo NULL – PeterB

+0

¿Por qué agregó una relación bidireccional? Lo que hice fue evitar tal relación. Si desea conocer el administrador de un equipo, debe escribir un método en su modelo de equipo. como function getManager() e implemente el método usted mismo. El sql debería ser algo así como "seleccionar top 1 del usuario u donde u.manager_for =?" –

+0

Cometí un error. No necesita escribir un método getManager() usted mismo. Y tampoco necesita agregar una relación bidireccional. La relación es automáticamente bidireccional. Por ejemplo, si agrega una relación de Usuario a Equipo, entonces tiene dos métodos: usuario-> getTeam() y equipo-> getUsers() automáticamente. Para su ejemplo: habrá dos métodos usuario-> getManagedTeam() y team-> getManager(). Tengo que leer su schema.xml para contarle más detalles. –

Cuestiones relacionadas