131 votes

Comment trier la méthode de findAll Doctrine ?

J'ai lu la documentation de Doctrine, mais je n'ai pas réussi à trouver un moyen de trier les résultats de findAll().

J'utilise symfony2 + doctrine, voici la déclaration que j'utilise dans mon contrôleur :

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

mais je veux que les résultats soient classés par noms d'utilisateurs ascendants.

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

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

mais cela ne fonctionne pas (il ne se plaint pas non plus).

Existe-t-il un moyen de faire cela sans construire une requête DQL ?

5voto

Lighthart Points 2976

Vous devez utiliser un critère, par exemple :

<?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,
        ]);
    }
}

5voto

Regardez le code source de l'API Doctrine :

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

5voto

Shaz Points 103

La méthode findBy de Symfony accepte deux paramètres. Le premier est le tableau des champs sur lesquels vous voulez effectuer la recherche et le second est le champ de tri et son ordre.

public function findSorted()
    {
        return $this->findBy(['name'=>'Jhon'], ['date'=>'DESC']);
    }

2voto

nifr Points 17866

Vous pouvez trier un ArrayCollection existant en utilisant un itérateur de tableau.

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

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

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

2voto

Mahdi Dhifi Points 113

Essayez ça :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X