/** * Handle the user request and return an array of all elements. * * @param Table $table * @param Request $request * @param bool $paginate : limit selections with pagination mecanism * @param bool $getObjects : get objects (else, only scalar results) * * @return Response * * table attributes are modified (if paginate=true) */ public function getRows(Table $table, Request $request, $paginate = true, $getObjects = true) { $table->setRowsPerPage($request->get('rowsPerPage', 10)); $table->setPage($request->get('page', 1)); foreach ($request->get('hiddenColumns', []) as $hiddenColumnName => $notUsed) { $column = $table->getColumnByName($hiddenColumnName); if (!is_null($column)) { $column->setHidden(true); } } $qb = $table->getQueryBuilder(); if ($paginate) { // @todo: had possibility to define custom count queries $this->setTotalRows($table); $this->setFilteredRows($table, $request); // compute last page and floor curent page $table->setLastPage(ceil($table->getFilteredRows() / $table->getRowsPerPage())); if ($table->getPage() > $table->getLastPage()) { $table->setPage($table->getLastPage()); } $qb->setMaxResults($table->getRowsPerPage()); $qb->setFirstResult(($table->getPage() - 1) * $table->getRowsPerPage()); } // add filters $this->addSearch($table, $request, $qb); // handle ordering $queryParams = $request->get($table->getFormId()); if (isset($queryParams['sortColumn']) && $queryParams['sortColumn'] != '') { $column = $table->getColumnByName($queryParams['sortColumn']); // if column exists if (!is_null($column)) { if (!is_null($column->getSort())) { $qb->resetDQLPart('orderBy'); if (isset($queryParams['sortReverse'])) { $sortReverse = $queryParams['sortReverse']; } else { $sortReverse = false; } foreach ($column->getAutoSort($sortReverse) as $sortField => $sortOrder) { $qb->addOrderBy($sortField, $sortOrder); } } } } // force a final ordering by id $qb->addOrderBy($table->getAlias() . '.id', 'asc'); $query = $qb->getQuery(); // if we need to get objects if ($getObjects) { // @todo: change the method to get objects from SCALAR selection, in place of a second query.... if (!is_null($qb->getDQLPart('groupBy'))) { // results as objects $objects = []; foreach ($query->getResult(Query::HYDRATE_OBJECT) as $object) { if (is_object($object)) { $objects[$object->getId()] = $object; } elseif (isset($object[0]) && is_object($object[0])) { $objects[$object[0]->getId()] = $object[0]; } } } } $rows = $query->getResult(Query::HYDRATE_SCALAR); // if we need to get objects if ($getObjects) { // results as scalar foreach ($rows as &$row) { if (isset($objects[$row[$table->getAlias() . '_id']])) { $row['object'] = $objects[$row[$table->getAlias() . '_id']]; } } } return $rows; }