Comment sortinger la méthode de findAll Docsortingne

J’ai lu la documentation de Docsortingne, mais je n’ai pas pu trouver un moyen de sortinger les résultats de findAll ().

J’utilise la docsortingne symfony2 +, c’est la déclaration que j’utilise dans mon contrôleur:

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

mais je veux que les résultats soient classés par nom d’utilisateur croissant.

J’ai essayé de passer un tableau comme argument de cette façon:

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

mais ça ne marche pas (il ne se plaint pas non plus).

Est-il possible de le faire sans créer une requête DQL?

    Comme @Lighthart comme indiqué, oui, c’est possible, même si cela ajoute beaucoup de graisse au contrôleur et n’est pas sec.

    Vous devriez vraiment définir votre propre requête dans le référentiel d’entités, c’est simple et pratique.

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

    Ensuite, vous devez indiquer à votre entité de rechercher des requêtes dans le référentiel:

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

    Enfin, dans votre contrôleur:

     $this->getDocsortingne()->getRepository('AcmeBundle:User')->findAll(); 
     $this->getDocsortingne()->getRepository('MyBundle:MyTable')->findBy([], ['username' => 'ASC']); 

    Il est utile de regarder parfois le code source.

    Par exemple, l’implémentation de findAll est très simple ( vendor/docsortingne/orm/lib/Docsortingne/ORM/EntityRepository.php ):

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

    Nous regardons donc findBy et trouvons ce dont nous avons besoin ( orderBy )

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

    Simple:

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

    Cela fonctionne pour moi:

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

    Garder le premier tableau vide récupère toutes les données, cela a fonctionné dans mon cas.

    Vous devez utiliser un critère, par exemple:

     >, null, null ); $rep = $this->getDocsortingne()->getManager()->getRepository('Bundle:Thing'); $things = $rep->matching($criteria); return $this->render('Bundle:Thing:things.html.twig', [ 'entities' => $things, ]); } } 

    Regardez le code source de l’API Docsortingne:

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

    Vous pouvez sortinger une collection ArrayCollection existante à l’aide d’un iterator de tableau.

    en supposant que $ collection est votre ArrayCollection retourné par findAll ()

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

    Cela peut facilement être transformé en une fonction que vous pouvez mettre dans votre référentiel afin de créer la méthode findAllOrderBy ().

    J’utilise une alternative à la solution qui a écrit nifr.

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

    C’est plus rapide que la clause ORDER BY et sans la surcharge de l’iterator.

    Essaye ça:

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

    Modifiez la fonction findAll par défaut dans EntityRepository comme ceci:

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

    De cette façon, vous pouvez utiliser le ” findAll ” sur n’importe quelle requête pour n’importe quelle table de données avec une option pour sortinger la requête