如何排序findAll Doctrine的方法

时间:2013-06-14 20:38:26

标签: symfony doctrine-orm

我一直在阅读Doctrine的文档,但我无法找到一种方法来对findAll()结果进行排序。

我正在使用symfony2 + doctrine,这是我在Controller中使用的语句:

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

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

我一直试图以这种方式传递数组作为参数:

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

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

有没有办法在不构建DQL查询的情况下执行此操作?

12 个答案:

答案 0 :(得分:201)

如图所示@Lighthart,是的,这是可能的,虽然它会给控制器增加很多脂肪并且不会干。

您应该在实体存储库中真正定义自己的查询,这是简单且最佳实践。

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();

答案 1 :(得分:75)

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

答案 2 :(得分:21)

简单:

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

答案 3 :(得分:20)

有时查看源代码很有用。

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

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

因此,我们查看findBy并找到我们需要的内容(orderBy

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

答案 4 :(得分:6)

这对我有用:

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

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

答案 5 :(得分:5)

您需要使用标准,例如:

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

答案 6 :(得分:5)

查看Doctrine API源代码:

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

答案 7 :(得分:2)

您可以使用数组迭代器对现有的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()方法。

答案 8 :(得分:2)

我使用了编写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 子句更快,没有迭代器的开销。

答案 9 :(得分:2)

试试这个:

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

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

答案 10 :(得分:1)

Symfony中的

findBy方法,除了两个参数。第一个是要搜索的字段数组,第二个是排序字段及其顺序

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

答案 11 :(得分:0)

修改EntityRepository中的默认findAll函数,如下所示:

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

这样你可以在任何数据表的任何查询中使用''findAll'',并可以选择对查询进行排序