在没有Doctrine paginator扩展的Doctrine2 / Symfony2中使用分页

时间:2012-03-06 15:17:09

标签: symfony doctrine-orm

我正在使用Doctrine2进行可能获得大量流量的项目,我很想在搜索页面中进行一些分页,并且每页只能获取5个结果 那么有没有一个很好的方法来做到这一点,而不需要使用教义扩展和保持ORM抽象层?我的意思是我不想写任何形式的dql查询并保持我的代码格式:

 $repo= $this->getDoctrine()
                    ->getEntityManager()
                    ->getRepository('AcmeOfficeBundle:Project');
        $list=$repo->findBy(array('PROJ_private' => "0"));

3 个答案:

答案 0 :(得分:36)

Doctrine 2.2 ships with a paginator。但是, 要求您编写DQL查询。

如果你坚持不编写任何DQL,你可以从查看Doctrine EntityRepository类开始;具体而言,the findBy() method。它有限制和偏移的可选参数,因此您可以尝试这样的事情(使用您的示例作为基线):

$num_pages = x; // some calculation of what page you're currently on
$repo = $this->getDoctrine()
                ->getRepository('AcmeOfficeBundle:Project');
$list = $repo->findBy(
    array('PROJ_private' => "0"), //search criteria, as usual
    array(/* orderBy criteria if needed, else empty array */),
    5, // limit
    5 * ($num_pages - 1) // offset
);

答案 1 :(得分:1)

在Doctrine ORM 2.3中,您还可以在实体存储库中使用Criteriamatching。现在(截至2.5)与nToMany关系有效。

当您的查询需要除equals之外的其他比较或分页另一个实体的OneToMany集合时,这会有所帮助。

$page = (isset($_GET['page']) && $_GET['page'] > 0 ? $_GET['page'] : 1);
$limit = 20;
$offset = ($limit * ($page - 1));
$criteria = \Doctrine\Common\Collections\Criteria::create()
    ->setMaxResults($limit)
    ->setFirstResult($offset);
$expr = $criteria->expr();
$user = $em->getRepository('AcmeOfficeBundle:Project')
    ->matching($criteria->where($expr->gt('PROJ_private', 0)));
$total_records = $user->count();

here

答案 2 :(得分:0)

避免编写DQL的一个好方法是使用Pagerfanta

对集合进行操作

https://github.com/whiteoctober/Pagerfanta

use Pagerfanta\Adapter\DoctrineCollectionAdapter;
$user = $em->find("App\DoctrineORM\User", 1);
$adapter = new DoctrineCollectionAdapter($user->getGroups());