Symfony 如何对findAll学说进行分类';什么方法?

Symfony 如何对findAll学说进行分类';什么方法?,symfony,doctrine-orm,Symfony,Doctrine Orm,我一直在阅读Doctrine的文档,但还没有找到对findAll()结果进行排序的方法 我使用的是symfony2+原则,这是我在控制器中使用的声明: $this->getDoctrine()->getRepository('AcmeBundle:User')->findAll(); $this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll() 但我希望结果按升序用户名排序 我一直在尝试以这种方式传递数组

我一直在阅读Doctrine的文档,但还没有找到对findAll()结果进行排序的方法

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

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

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

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

findAll(数组('username'=>ASC')

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


有没有办法不用构建DQL查询就可以做到这一点

您需要使用标准,例如:

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

正如@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();

可以使用数组迭代器对现有的ArrayCollection进行排序

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

$iterator=$collection->getIterator();
$iterator->uasort(函数($a,$b){
返回($a->getProperty()<$b->getProperty())?-1:1;
});
$collection=newarraycollection(迭代器到数组($iterator));

这可以很容易地转化为一个函数,您可以将其放入存储库中,以便创建findAllOrderBy()方法。

我使用编写nifr的解决方案的替代方案

$resultRows = $repository->fetchAll();
uasort($resultRows, function($a, $b){
    if ($a->getProperty() == $b->getProperty()) {
        return 0;
    }
    return ($a->getProperty()< $b->getProperty()) ? -1 : 1;
});
$resultRows=$repository->fetchAll();
uasort($resultRows,function($a,$b){
如果($a->getProperty()==b->getProperty()){
返回0;
}
返回($a->getProperty()<$b->getProperty())?-1:1;
});
它比ORDER BY子句更快,而且没有迭代器的开销。

这对我来说很有用:

$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(),array('name' => 'ASC'));
将第一个数组保留为空将返回所有数据,在我的情况下,它起到了作用。

尝试以下方法:

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

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

有时查看源代码是很有用的

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

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


查看Doctrine API源代码:

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

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

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

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

这样,您就可以在任何数据表的任何查询上使用“findAll”,并在Symfony中使用findBy方法对查询进行排序,但有两个参数除外。第一个是要搜索的字段数组,第二个数组是排序字段及其顺序

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

这是一种比我更好的方法,但您将编写dql;我的方法具有较少的dql,因此满足OP的约束。坦率地说,应该克服对dql的恐惧。如果可能的话,请优先使用这个方法,而不是我的方法。好吧,这不是对dql的恐惧,在阅读这个答案之前,我最终使用了dql来实现这一点,但我不想在一开始使用dql,因为我的控制器中没有任何dql,我想坚持控制器已经拥有的代码样式。这个解决方案对我来说真的很好!或者简单地:$this->getDoctrine()->getRepository('AcmeBundle:User')->findBy(array(),array('username'=>'ASC')@Benji_X80虽然这一班轮肯定更短,但它一点也不干燥。findAll方法属于存储库,而不是控制器。您是否可以告诉实体使用注释以外的任何其他方式在自定义存储库中查找查询?这是我见过的最糟糕的编程实践你的观点是什么?有足够多的用例用于此。。。i、 在PHP中对已经获取的集合进行排序总是比仅仅为了排序而执行另一个mysql查询要快!假设您需要在一个页面上以两种不同的排序样式输出相同的集合数据……通常,返回一个有序查询应该是数据库的工作。OTOH,这项技术确实适用于nifr提到的更复杂的案例。这就像一种魅力!在Symfony 4中仍然是这样的,你能给你的非常简短的答案添加一些解释吗?这是一个非常简短的答案。详细解释-解释。。。编辑。这是完美的答案!findBy(array(),array('fieldname'=>'ASC')这将查找所有字段并按指示的方向在字段上排序。请对您的答案进行进一步解释。在应用程序中排序如何比在数据库级别上排序更快?
$this->getDoctrine()->getRepository('AcmeBundle:User')->findBy(
    array(),
    array('username' => 'ASC')
);
public function findAll( array $orderBy = null )
{
    return $this->findBy([], $orderBy);
}
public function findSorted()
    {
        return $this->findBy(['name'=>'Jhon'], ['date'=>'DESC']);
    }