Expertos en Symfony y Drupal

Ordenar el resultado de un findAll() en Symfony2

Antes de nada, aclarar que la cláusula orderBy no es posible usarla con findAll(), únicamente está disponible desde el QueryBuilder, pero es la cantidad de consultas en foros sobre esta cuestión lo que nos ha movido a publicar este artículo.

Para acceder y manipular las entidades creadas en Symfony2, está disponible el objeto EntityManager que proporciona Doctrine. Este es un objeto especial que Symfony2 crea automáticamente y que está disponible a través del contenedor de dependencias. Para obtener este objeto desde un controlador únicamente es necesaria la siguiente sentencia con la que se almacena en la variable $em:


$em = $this->getDoctrine()->getEntityManager();

Para obtener datos de las tablas, el entity manager ofrece una serie una serie de métodos, que se pueden usar, según las necesidades: findAll(), find(), findBy() y findOneBy(). Con el primero de ellos se obtienen todos los registros de una tabla, por ejemplo, para obtener todas las categorías de un blog, almacenadas en la tabla correspondiente, se podría hacer lo siguiente:


$em = $this->getDoctrine()->getEntityManager(); 
$categorias = $em->getRepository('BlogBundle:Categoria')->findAll(); 

Pero qué ocurre si se pretende recuperar esa lista de categorías, ordenadas por orden alfabético.

Una opción, pasaría por definir un método findAllOrderedBy($nombre) en el repositorio correspondiente, en este caso en BlogBundle:Categoria, con el DQL incluyendo la clásula orderBy:


public function findAllOrderedByNombre() { 
    return $this->createQueryBuilder('a')
        ->addOrderBy('a.nombre', 'ASC')
        ->getResult(); 
} 

Otra opción, si no se quiere usar DQL, aunque menos correcta, sería utilizar el método findBy desde el controlador, de esta forma:


$em = $this->getDoctrine()->getEntityManager(); 
$tags = $em->getRepository('BlogBundle:Tag')
    ->findBy( array(), array('slug' => 'ASC') );

[x] Este sitio utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando estás aceptando su uso. Política de cookies.