lucasgiori/doctrine-pagination

Doctrine 分页

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

README

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

此库为 Doctrine 提供了一个分页的仓库和集合。

安装

使用 Symfony Flex 的应用程序

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

$ composer require lucasgiori/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);
}

参数 DTO 以便于数据搜索

use Doctrine\ORM\Query;
use DoctrinePagination\DTO\Params;

$params = (new Params())
                ->setCriteria(["field" => "teste"]) // Array the fields and values to apply filter in sql
                ->setPage(1) // Page of query data
                ->setPerPage(10) // Quantity per page
                ->setHydrateMode(Query::HYDRATE_ARRAY) //Result handling mode
                ->setSearchField("nome") // Search Field define field to apply `like` of sql
                ->setSearch("gazin"); // Field Value  apply `like` in sql

执行搜索数据的类,消耗 DTO 并返回 PaginatedArrayCollention

use DoctrinePagination\ORM\PaginatedRepository;
use DoctrinePagination\DTO\Params;

class Example extends PaginatedRepository {


    public function findWithFilter(Params $params): ?PaginatedArrayCollection
    {
        return $this->findPageWithDTO($params);
    }
}

使用 Paginated Repository

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 仓库方法,以提供代码兼容性。

使用 Paginated 集合

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