lucasgiori / doctrine-pagination
Doctrine 分页
Requires
- php: ^7.4
- doctrine/orm: ^2.7
Requires (Dev)
- phpunit/phpunit: ^9.1
README
此库为 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