Answers:
如图所示,如@Lighthart所示,是可以的,尽管它为控制器增加了很多脂肪,并且不是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('AcmeBundle:User')->findBy(
array(),
array('username' => 'ASC')
);
查看Doctrine API源代码:
class EntityRepository{
...
public function findAll(){
return $this->findBy(array());
}
...
}
您需要使用一个条件,例如:
<?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,
]);
}
}
Symfony中的findBy方法除外两个参数。第一个是要搜索的字段数组,第二个是排序字段及其顺序
public function findSorted()
{
return $this->findBy(['name'=>'Jhon'], ['date'=>'DESC']);
}
您可以使用数组迭代器对现有ArrayCollection进行排序。
假设$ collection是findAll()返回的ArrayCollection
$iterator = $collection->getIterator();
$iterator->uasort(function ($a, $b) {
return ($a->getPropery() < $b->getProperty()) ? -1 : 1;
});
$collection = new ArrayCollection(iterator_to_array($iterator));
可以轻松地将其转换为可放入存储库中的函数,以创建findAllOrderBy()方法。
试试这个:
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(), array('username' => 'ASC'));
我使用替代方法来编写nifr。
$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的开销。