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