[CRUD] make index query more abstract.

Improve build and count query in default index action to be customized
in one dedicated method.
This commit is contained in:
Julien Fastré 2020-06-18 15:27:27 +02:00
parent 28582d033b
commit 590c72ef02
2 changed files with 35 additions and 11 deletions

View File

@ -131,3 +131,11 @@ Version 1.5.19
- [address] add a "homeless" characteristic to addresses ; - [address] add a "homeless" characteristic to addresses ;
Version 1.5.20
==============
- [CRUD] make index query more abstract.
Improve build and count query in default index action to be customized
in one dedicated method.

View File

@ -276,6 +276,26 @@ class CRUDController extends AbstractController
*/ */
protected function onPostIndexFetchQuery(string $action, Request $request, int $totalItems, PaginatorInterface $paginator, $entities) { } protected function onPostIndexFetchQuery(string $action, Request $request, int $totalItems, PaginatorInterface $paginator, $entities) { }
/**
* Build the base query for listing all entities, normally use in a listing
* page.
*
* This base query does not contains any `WHERE` or `SELECT` clauses. Those
* are added by other methods, like `queryEntities` and `countQueries`.
*
* @param string $action
* @param Request $request
* @return QueryBuilder
*/
protected function buildQueryEntities(string $action, Request $request)
{
return $this->getDoctrine()->getManager()
->createQueryBuilder()
->select('e')
->from($this->getEntityClass(), 'e')
;
}
/** /**
* Query the entity. * Query the entity.
* *
@ -292,17 +312,12 @@ class CRUDController extends AbstractController
*/ */
protected function queryEntities(string $action, Request $request, PaginatorInterface $paginator) protected function queryEntities(string $action, Request $request, PaginatorInterface $paginator)
{ {
$query = $this->getDoctrine()->getManager() $query = $this->buildQueryEntities($action, $request)
->createQueryBuilder()
->select('e')
->from($this->getEntityClass(), 'e')
->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber()) ->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber())
->setMaxResults($paginator->getItemsPerPage()) ->setMaxResults($paginator->getItemsPerPage());
;
$this->orderQuery($action, $query, $request, $paginator); // allow to order queries and return the new query
return $this->orderQuery($action, $query, $request, $paginator);
return $query;
} }
@ -344,8 +359,9 @@ class CRUDController extends AbstractController
*/ */
protected function countEntities(string $action, Request $request): int protected function countEntities(string $action, Request $request): int
{ {
return $this->getDoctrine()->getManager() return $this->buildQueryEntities($action, $request)
->createQuery("SELECT COUNT(e) FROM ".$this->getEntityClass()." e") ->select('COUNT(e)')
->getQuery()
->getSingleScalarResult() ->getSingleScalarResult()
; ;
} }