2011-08-04 6 views
5

Me gustaría incluir algunas funciones adicionales en mis entidades de Doctrine 2 para contener el código que voy a tener que ejecutar con bastante frecuencia. Por ejemplo:¿Puedo incluir una consulta de conveniencia en un Método de Entidad Doctrine 2?

usuario - tiene muchos mensajes
Post - tiene un solo usuario

Ya tengo una función $user->getPosts(), pero esto se recuperan todos mis mensajes. Estoy buscando para escribir una $user->getActivePosts(), que sería como:

$user->getPosts()->where('active = true') //if this were possible
o:
$em->getRepository('Posts')->findBy(array('user'=>$user,'active'=>true)) //if this were more convenient

Por lo que yo puedo decir, no hay manera de volver al gestor de la entidad a pesar de la Entidad en sí, así que mi única opción sería

class User { 
    function getActivePosts() { 
    $all_posts = $this->getPosts(); 
    $active_posts = new ArrayCollection(); 
    foreach ($all_posts as $post) { 
     if ($post->getActive()) { 
      $active_posts->add($post); 
     } 
    } 
    return $active_posts; 
} 

Sin embargo, esto me obliga a cargar todos los mensajes en mi gestor de la entidad, cuando en realidad sólo quiero un pequeño subconjunto de ellos, y me obliga a hacer el filtrado en PHP, cuando sería m Es más apropiado hacerlo en la capa SQL. ¿Hay alguna forma de lograr lo que estoy buscando hacer dentro de la Entidad, o tengo que crear código fuera de ella?

Respuesta

5

Creo que debería implementar el método en el PostRepository en lugar de en el modelo de entidad.

Intento mantener toda la lógica relacionada con el modelo en los repositorios detrás de los métodos "específicos del dominio". De esta manera, si cambia la forma en que representa si una publicación está activa o no, solo tiene que cambiar la implementación de un único método en lugar de tener que encontrar todas las declaraciones active = true diseminadas en su aplicación o realizar cambios en un "no relacionado" modelo de entidad.

Algo como esto

PostRepository extends EntityRepository { 
    public function findActiveByUser($user){ 
    // whatever it takes to get the active posts 
    } 
} 
+1

correcta. Cada vez que esté inclinado a poner un entitymanager dentro de una entidad, sabe que es hora de dar un paso atrás y pensar en hacer lo que esté haciendo en un servicio o repositorio de algún tipo. En el caso de OP, si solo quiere filtrar la colección de Publicaciones, podría hacerlo en la Entidad simplemente haciendo un bucle sobre $ this-> posts y completando una matriz: agradable y limpia, pero no muy eficiente ya que requiere carga/hidratación todas las publicaciones del usuario. – timdev

+0

¿Se considera una mala práctica que Post Entity llame al PostRepository :: findActiveByUser() dentro de su propio método findActivePosts()? –

Cuestiones relacionadas