如何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'));