pportelette / pageable-bundle
This Bundle provides pagination repository's method based on Doctrine Paginator
Package info
github.com/pportelette/SymfonyPageableBundle
Type:symfony-bundle
pkg:composer/pportelette/pageable-bundle
Requires
- php: >=7.2.5
- doctrine/doctrine-bundle: ^2.7|^3.0
- symfony/framework-bundle: ^5.3|^6.0|^7.0|^8.0
Conflicts
README
This bundle adds a method 'getPage' to a Doctrine repository that paginates the result of a query. It provides also the methods 'add' and 'remove'.
Installation
Open a command console, enter your project directory and execute:
$ composer require pportelette/pageable-bundle
Applications that don't use Symfony Flex
Then, enable the bundle by adding it to the list of registered bundles
in the config/bundles.php file of your project:
// config/bundles.php return [ Pportelette\PageableBundle\PportelettePageableBundle::class => ['all' => true], ];
Usage
From a doctrine repository:
// src/Repository/MyRepository.php use Pportelette\PageableBundle\Repository\AbstractRepository; use Pportelette\PageableBundle\Model\Pageable; class MyRepository extends AbstractRepository { public function getAllPaginated(int $page): Pageable { $queryBuilder = $this->createQueryBuilder('e'); $nbPerPage = 50; return $this->getPage( $queryBuilder, $page, $nbPerPage ); } }
That's it!
The third parameter is optional and is '30' by default. It is possible to change the default value by adding a configuration file:
# config/packages/pportelette_pageable.yaml pportelette_pageable: default: nb_per_page: 50
Filters and sorting
You can filter or sort your results by binding query params to a column alias, even on joined tables :
public function getUsers(int $page, array $queryParams): Pageable { // bind query params to columns $this->addFilter('email', 'u.email'); $this->addFilter('country', 'c.name'); $qb = $this->createQueryBuilder('u') ->leftJoin('u.country', 'c'); // this will add the conditions to the where $this->setFilters($qb, $queryParams); return $this->getPage( $qb, $page, ); }
In the example above, if $queryParams = ['email' => '@test.com', 'country' => 'france', 'sort' => 'country,ASC'], it will generate the following sql :
WHERE u.email LIKE '%@test.com%' AND c.name LIKE '%france%' ORDER BY c.name ASC