Fix total row count computation to work with filters for outlet list

This commit is contained in:
Kendrick Chan 2018-01-14 22:46:16 +08:00
parent b3c056ab23
commit b496767bd1

View file

@ -6,6 +6,7 @@ use App\Ramcar\BaseController;
use App\Entity\Outlet;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
@ -34,14 +35,15 @@ class OutletController extends BaseController
->getRepository(Outlet::class)
->createQueryBuilder('q');
// count total records
$total = $qb->select('COUNT(q)')
->getQuery()
->getSingleScalarResult();
// get datatable params
$datatable = $req->request->get('datatable');
// count total records
$tquery = $qb->select('COUNT(q)');
$this->setQueryFilters($datatable, $tquery);
$total = $tquery->getQuery()
->getSingleScalarResult();
// get current page number
$page = $datatable['pagination']['page'] ?? 1;
@ -60,13 +62,7 @@ class OutletController extends BaseController
// build query
$query = $qb->select('q');
// check if filter is present
if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
$query->where('q.name LIKE :filter')
->orWhere('q.address LIKE :filter')
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
}
$this->setQueryFilters($datatable, $query);
// check if sorting is present, otherwise use default
if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) {
@ -81,7 +77,6 @@ class OutletController extends BaseController
->setMaxResults($perpage)
->getQuery()
->getResult();
// Query::HYDRATE_ARRAY);
// process rows
$rows = [];
@ -94,7 +89,6 @@ class OutletController extends BaseController
$row['time_open'] = $orow->getTimeOpen()->format('h:i A');
$row['time_close'] = $orow->getTimeClose()->format('h:i A');
// add row metadata
$row['meta'] = [
'update_url' => '',
@ -148,6 +142,15 @@ class OutletController extends BaseController
->setCoordinates($point);
}
protected function setQueryFilters($datatable, QueryBuilder $query)
{
if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
$query->where('q.name LIKE :filter')
->orWhere('q.address LIKE :filter')
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
}
}
public function addSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator)
{
$this->denyAccessUnlessGranted('outlet.add', null, 'No access.');