2012-04-26 13 views
5

Soy nuevo en Doctrine, mongo y la configuración ODM y mientras juego con esta configuración en ZF1 estoy tratando de replicar una referencia simple a muchas con una restricción. Esta es la situación y me gustaría obtener algunos consejos sobre cómo lograr esto.Doctrine ODM MongoDB - Replicar una Referencia simple de Uno a Muchos con Restricción

Esta es una sencilla por el usuario> asignación de funciones, por lo que en una situación de SQL que tendría tablas de la siguiente manera:

 
Users 
- id 
- name 
- role_id 

Roles 
- id 
- name 

A continuación, una restricción de clave externa se establecería en los usuarios ROLE_ID para asignar a la función carné de identidad. Y al eliminar un rol, se activaría una restricción de clave externa parando la operación.

¿Cómo podría lograr el mismo objetivo en Doctrines MongoDB ODM?

Hasta ahora he jugado con diferentes tipos de anotaciones en la entidad de usuario incluyendo @ReferenceOne @ReferenceMany con diferentes opciones en cascada ...

La elección dejó a mí ahora es implementar @PreUpdate, eventos del ciclo de vida @PreRemove en la entidad 'rol' y luego verifique que ningún usuario esté usando el rol; si están en ese momento en la actualización, cambie la referencia para hacer coincidir o para eliminar arrojar una excepción.

¿Estoy aquí o perdido?

Gracias,

Si

Respuesta

7

para algo así como que no iba a tener dos tablas '' separadas como lo haría en SQL. Simplemente tendrá el tipo de rol como una propiedad del usuario. Y luego, si desea eliminar un tipo de rol, puede manipular el campo de rol de todos los usuarios con ese rol.

Pero para responder a su pregunta, lo haría así.

<?php 
class User { 
    /** @MongoDB\Id */ 
    protected $id; 
    /** @MongoDB\String */ 
    protected $name; 
    /** @MongoDB\ReferenceOne(targetDocument="Role", mappedBy="user") */ 
    protected $role; 

    //Getters/Setters 
} 

class Role { 
    /** @MongoDB\Id */ 
    protected $id; 
    /** @MongoDB\String */ 
    protected $name; 
    /** @MongoDB\ReferenceMany(targetDocument="User", inversedBy="role") */ 
    protected $users; 

    public function _construct() { 
     $this->users = new Doctrine\Common\Collections\ArrayCollection; 
    } 
    // Getters/Setters 

    public function hasUsers() { 
     return !$this->users->isEmpty(); 
    } 
} 

Luego crearía una clase de servicio para trabajar con mi administrador de documentos.

class RoleService { 
    public function deleteRole(Role $role) { 
     if (!$role->hasUsers()) { 
      // Setup the documentManager either in a base class or the init method. Or if your über fancy and have php 5.4, a trait. 
      $this->documentManager->remove($role); 
      // I wouldn't always do this in the service classes as you can't chain 
      // calls without a performance hit. 
      $this->documentManager->flush(); 
     } 
    } 
} 
+0

¡Gran respuesta, muchas gracias! –

+1

No hay problema. He pasado por el mismo dolor que cuando empezaste con Doctrine. ¡Es increíble una vez que te acostumbras! –

+1

Creo que es realmente bueno hasta ahora. Hace que construir una capa de servicio en la parte superior sea mucho más fácil. Un pequeño punto es I the Roles :: hasUsers() debería devolver! $ This-> users-> isEmpty(); para invertir el booleano Muchas gracias por su ayuda y esto funciona como un sueño. –

Cuestiones relacionadas