update symfony2 getrepository getdoctrine force ejemplos delete consultas symfony doctrine2

symfony2 - symfony update schema force



Cómo ordenar el método FindAll Doctrine (11)

He estado leyendo la documentación de Doctrine, pero no he podido encontrar una forma de ordenar los resultados de FindAll ().

Estoy usando symfony2 + doctrine, esta es la declaración que estoy usando dentro de mi Controller:

$this->getDoctrine()->getRepository(''MyBundle:MyTable'')->findAll();

pero quiero que los resultados sean ordenados por nombres de usuario ascendentes.

He estado tratando de pasar una matriz como argumento de esta manera:

findAll( array(''username'' => ''ASC'') );

pero no funciona (tampoco se queja).

¿Hay alguna manera de hacer esto sin construir una consulta DQL?


A veces es útil mirar el código fuente.

Por ejemplo, findAll implementation es muy simple ( vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php ):

public function findAll() { return $this->findBy(array()); }

Entonces buscamos findBy y encontramos lo que necesitamos ( orderBy )

public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)


Como @Lighthart como se muestra, sí, es posible, aunque agrega grasa significativa al controlador y no está SECO.

Realmente debe definir su propia consulta en el repositorio de entidades, es una práctica simple y mejor.

use Doctrine/ORM/EntityRepository; class UserRepository extends EntityRepository { public function findAll() { return $this->findBy(array(), array(''username'' => ''ASC'')); } }

Luego debe decirle a su entidad que busque consultas en el repositorio:

/** * @ORM/Table(name="User") * @ORM/Entity(repositoryClass="Acme/UserBundle/Entity/Repository/UserRepository") */ class User { ... }

Finalmente, en su controlador:

$this->getDoctrine()->getRepository(''AcmeBundle:User'')->findAll();


Debe usar un criterio, por ejemplo:

<?php namespace Bundle/Controller; use Symfony/Bundle/FrameworkBundle/Controller/Controller; use Symfony/Component/HttpFoundation/Request; use Doctrine/Common/Collections/Criteria; /** * Thing controller */ class ThingController extends Controller { public function thingsAction(Request $request, $id) { $ids=explode('','',$id); $criteria = new Criteria(null, <<DQL ordering expression>>, null, null ); $rep = $this->getDoctrine()->getManager()->getRepository(''Bundle:Thing''); $things = $rep->matching($criteria); return $this->render(''Bundle:Thing:things.html.twig'', [ ''entities'' => $things, ]); } }


Esto funciona para mí:

$entities = $em->getRepository(''MyBundle:MyTable'')->findBy(array(),array(''name'' => ''ASC''));

Mantener el primer conjunto vacío recupera todos los datos, funcionó en mi caso.


Mire el código fuente de Doctrine API:

class EntityRepository{ ... public function findAll(){ return $this->findBy(array()); } ... }


Modifique la función findAll predeterminada en EntityRepository de la siguiente manera:

public function findAll( array $orderBy = null ) { return $this->findBy([], $orderBy); }

De esta forma puede usar '''' buscar todo '''' en cualquier consulta para cualquier tabla de datos con una opción para ordenar la consulta


Prueba esto:

$em = $this->getDoctrine()->getManager(); $entities = $em->getRepository(''MyBundle:MyTable'')->findBy(array(), array(''username'' => ''ASC''));


Puede ordenar una ArrayCollection existente utilizando un iterador de matriz.

suponiendo que $ collection es tu ArrayCollection devuelta por findAll ()

$iterator = $collection->getIterator(); $iterator->uasort(function ($a, $b) { return ($a->getPropery() < $b->getProperty()) ? -1 : 1; }); $collection = new ArrayCollection(iterator_to_array($iterator));

Esto puede convertirse fácilmente en una función que puede poner en su repositorio para crear el método findAllOrderBy ().


Sencillo:

$this->getDoctrine()->getRepository(''AcmeBundle:User'')->findBy( array(), array(''username'' => ''ASC'') );


Utilizo una alternativa a la solución que escribió nifr.

$resultRows = $repository->fetchAll(); uasort($resultRows, function($a, $b){ if ($a->getProperty() == $b->getProperty()) { return 0; } return ($a->getProperty()< $b->getProperty()) ? -1 : 1; });

Es más rápido que la cláusula ORDER BY , y sin la sobrecarga del Iterator.


$this->getDoctrine()->getRepository(''MyBundle:MyTable'')->findBy([], [''username'' => ''ASC'']);