lucasgiori / pagination-doctrine
Doctrine pagination
Requires
- php: ^8.0
- doctrine/orm: ^2.8
Requires (Dev)
- phpunit/phpunit: ^9.3.7
This package is not auto-updated.
Last update: 2024-11-17 07:39:15 UTC
README
This library provides a paginated repository and collection for Doctrine.
Installation
Applications that use Symfony Flex
Open a command console, enter your project directory and execute:
$ composer require lucasgiori/doctrine-pagination
Configure Repository
Use it as Entity repository
Configure PaginatedRepository in your entity:
namespace Entity; use Doctrine\ORM\Mapping as ORM; /** * Class Task * * @ORM\Table(name="task") * @ORM\Entity(repositoryClass="DoctrinePagination\ORM\PaginatedRepository") */ class Task { }
Create your custom Paginated repository
Create custom repository extending PaginatedRepository:
namespace Repository; use DoctrinePagination\ORM\PaginatedQueryBuilder; use DoctrinePagination\ORM\PaginatedRepository; /** * Class TaskRepository */ class TaskRepository extends PaginatedRepository { }
Configure your Entity:
namespace Entity; use Doctrine\ORM\Mapping as ORM; /** * Class Task * * @ORM\Table(name="task") * @ORM\Entity(repositoryClass="Repository\TaskRepository") */ class Task { }
If needed, override processCriteria method in your custom repository to add some custom actions:
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); }
Parameter DTO to facilitate data searches:
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
Class that performs the search of data consuming DTO and return PaginatedArrayCollention;
use DoctrinePagination\ORM\PaginatedRepository; use DoctrinePagination\DTO\Params; class Example extends PaginatedRepository { public function findWithFilter(Params $params): ?PaginatedArrayCollection { return $this->findPageWithDTO($params); } }
Using Paginated Repository
public findPageBy ($page, $per_page, array $criteria = [], array $orderBy = null)
Returns a paginated collection of elements that matches criteria.
public countBy (array $criteria = [])
Returns the total number of elements that matches criteria.
protected createPaginatedQueryBuilder (array $criteria = [], $indexBy = null)
This method is used by findPageBy and countBy methods to create a QueryBuilder, and can be used in other repository custom methods.
processCriteria (protected)
This method is called from createPaginatedQueryBuilder to add criteria conditions.
This can be overridden to customize those criteria conditions.
findBy and findAll
PaginatedRepository overrides findBy and findAll default Doctrine Repository methods to provides code compatibility.
Using Paginated Collections
The PaginatedRepository always returns a 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