如何sortingfindAll Doctrine的方法

我一直在阅读Doctrine的文档,但是我一直没能findsortingfindAll()结果的方法。

我正在使用symfony2 +原则,这是我在我的控制器中使用的声明:

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

但我希望结果按照用户名升序排列。

我一直在试图通过这样一个parameter passing数组:

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

但它不起作用(它也不抱怨)。

有没有办法做到这一点,而不build立一个DQL查询?

就像@Lighthart所示的那样,是的,尽pipe它给控制器增加了大量的脂肪,而不是DRY。

你应该真的在实体库中定义你自己的查询,这是简单和最好的做法。

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

然后,您必须告诉您的实体在存储库中查找查询:

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

最后,在你的控制器中:

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

有时候看源代码是很有用的。

例如findAll实现非常简单( vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php ):

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

所以我们看findBy并find我们需要的( orderBy

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

简单:

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

您需要使用一个标准,例如:

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

这适用于我:

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

保持第一个数组为空取回所有的数据,它在我的情况。

看看Doctrine API的源代码:

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

您可以使用数组迭代器对现有的ArrayCollection进行sorting。

假设$ collection是你的ArrayCollection由findAll()返回的

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

这可以很容易地变成一个函数,你可以把你的存储库,以创buildfindAllOrderBy()方法。

我使用写入nifr的解决scheme的替代scheme。

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

它比ORDER BY子句更快,并且没有Iterator的开销。

尝试这个:

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