如何排序找到所有主义的方法?

我一直在阅读 Doctrine 的文档,但是我还没有找到对 find All () Results 进行排序的方法。

我使用 symfony2 + 原则,这是我在 Controller 中使用的语句:

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

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

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

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

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

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

206947 次浏览

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

<?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 所示,是的,这是可能的,尽管它给控制器增加了大量的脂肪,而且不是 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();

可以使用数组迭代器对现有 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 ()方法,这个函数可以很容易地转换为一个可以放入存储库的函数。

$this->getDoctrine()->getRepository('MyBundle:MyTable')->findBy([], ['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;
});

它比 订购人子句快,而且没有迭代器的开销。

这对我有用:

$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) :

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

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

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

查看 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']);
}