kadudutra/doctrine-pagination

Doctrine 分页

v2.1.3 2021-01-03 20:43 UTC

This package is auto-updated.

Last update: 2024-09-29 05:56:09 UTC


README

Minimum PHP Version Latest Stable Version Latest Unstable Version License Total Downloads

此库为 Doctrine 提供了分页存储库和集合。

安装

使用 Symfony Flex 的应用程序

打开命令行,进入您的项目目录并执行

$ composer require kadudutra/doctrine-pagination

配置存储库

将其用作实体存储库

在实体中配置 PaginatedRepository

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Class Task
 *
 * @ORM\Table(name="task")
 * @ORM\Entity(repositoryClass="DoctrinePagination\ORM\PaginatedRepository")
 */
class Task
{

}

创建自定义的 Paginated 存储库

创建自定义存储库,继承自 PaginatedRepository

namespace Repository;

use DoctrinePagination\ORM\PaginatedQueryBuilder;
use DoctrinePagination\ORM\PaginatedRepository;

/**
 * Class TaskRepository
 */
class TaskRepository extends PaginatedRepository
{

}

配置实体

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Class Task
 *
 * @ORM\Table(name="task")
 * @ORM\Entity(repositoryClass="Repository\TaskRepository")
 */
class Task
{

}

如有需要,在自定义存储库中重写 processCriteria 方法以添加一些自定义操作

protected function processCriteria(PaginatedQueryBuilder $qb, array $criteria)
{
    foreach ($criteria as $field => $value) {
        switch ($field) {
            case 'description':
                $qb->andWhere(...);
                unset($criteria[$field]);
                break;
        }
    }

    parent::processCriteria($qb, $criteria);
}

使用 Paginated 存储库

public findPageBy ($page, $per_page, array $criteria = [], array $orderBy = null)

返回符合条件元素的分页集合。

public countBy (array $criteria = [])

返回符合条件元素的总数。

protected createPaginatedQueryBuilder (array $criteria = [], $indexBy = null)

此方法用于 findPageBy 和 countBy 方法创建 QueryBuilder,也可用于其他存储库自定义方法。

processCriteria (受保护)

此方法从 createPaginatedQueryBuilder 调用以添加条件。

可以重写以自定义这些条件。

findBy 和 findAll

PaginatedRepository 重写了 findBy 和 findAll 默认的 Doctrine 存储库方法,以提供代码兼容性。

使用分页集合

PaginatedRepository 总是返回 PaginatedArrayCollection

// some parameters
$page = 5;
$per_page = 10;

// get repository
$repository = $doctrine->getRepository('Task');

/** @var PaginatedArrayCollection */
$result = $repository->findPageBy($page, $per_page, ['field'=>'value']);

count()

// count obtained results as usual
$pageResults = $result->count(); // 10

getTotal()

// get total results
$totalResults = $result->getTotal(); // 95

getPage()

// current page
$currentPage = $result->getPage(); // 5

getResultsPerPage()

// current results per page
$currentResultsPerPage = $result->getResultsPerPage(); // 10

getPages()

// get total pages
$totalPages = $result->getPages(); // 10

getNextPage()

// get next page number
$nextPage = $result->getNextPage(); // 6

getPrevPage()

// get prev page number
$prevPage = $result->getPrevPage(); // 4