lucasgiori / pagination-doctrine
Doctrine 分页
Requires
- php: ^8.0
- doctrine/orm: ^2.8
Requires (Dev)
- phpunit/phpunit: ^9.3.7
This package is not auto-updated.
Last update: 2024-09-22 06:57:30 UTC
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 仓库
public findPageBy ($page, $per_page, array $criteria = [], array $orderBy = null)
返回匹配条件的元素的分页集合。
public countBy (array $criteria = [])
返回匹配条件的元素总数。
protected createPaginatedQueryBuilder (array $criteria = [], $indexBy = null)
此方法由 findPageBy 和 countBy 方法用于创建 QueryBuilder,并可用于其他仓库自定义方法。
processCriteria (protected)
此方法从 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