原则 2:分页链接生成


Doctrine 2: Pagination Link Generation

我没有找到任何关于这个主题的内容,而且教义文档在分页方面非常参差不齐,所以这里是:

我在 Laravel 4 之上使用教义 2。我正在尝试让分页工作,并且已经返回了结果的第一页,如下所示:

public function paginate($query, $page_size, $current_page){
    $paginator  = new 'Doctrine'ORM'Tools'Pagination'Paginator($query);
    $total_results = count($paginator);
    $pagesCount = ceil($total_results / $page_size);
    // now get one page's items:
    $paginator
        ->getQuery()
        ->setFirstResult($page_size * ($current_page-1)) // set the offset
        ->setMaxResults($page_size); // set the limit
    foreach ($paginator as $pageItem) {
        $results[] = $pageItem;
    }   
    return $results;
}

但这只对第一页有好处。当我想点击到结果的第 n 页时,我不知道如何开始。我还没有找到任何存储 DQL 查询的方法(它不能传递到视图或存储在会话变量中(。

有什么想法吗?

好吧,我在我的应用程序中使用教义和 laravel 有这种方法。看一看:

public function paginate($pageNumber = 1, $recordsPerPage = 20)
{
    // updating page number according to records per page
    $pageNumber = ($pageNumber == 1)? 0 : (($pageNumber -1) * 20);
    /** @var $qb QueryBuilder $qb */
    $qb = 'Doctrine::createQueryBuilder();
    $qb->select('m');
    $qb->from('models'MyModel', 'm');
    $qb->orderBy('m.name', 'asc');
    $qb->setMaxResults($recordsPerPage);
    $qb->setFirstResult($pageNumber);
    $records = $qb->getQuery()->getResult();
    // creating the paginator with the results
    $paginator = 'Paginator::make($records, $this->totalOfRecords(), $recordsPerPage);
    $paginator->setBaseUrl('my-paginator-url');
    // HERE you can do some stuff with the $paginator and $records vars
}

public function totalOfRecords()
{
    /** @var $qb QueryBuilder $qb */
    $qb = 'Doctrine::createQueryBuilder();
    $qb->select('count(m)');
    $qb->from('models'MyModel', 'm');
    // return total of records 
    return $qb->getQuery()->getSingleScalarResult();
}

然后,您可以执行以下操作:

// paginate the first page with 10 records per page (showing records from 0 to 9)
$this->paginate(1, 10);
// paginate the third page with 20 records per page (showing records from 30 to 49)
$this->paginate(3, 20);