2013-08-27 8 views
5

Sto incontrando un problema con Doctrine Paginator.Dottrina impaginatore

Nel mio repository ho una funzione per recuperare un set di dati specifico. Io uso il QueryBuilder per questo:

{myEntityRepository}->createQueryBuilder($alias) 

Al fine di selezionare solo i campi specifici Io uso il seguente:

if (count($selectFields) > 0) { 
    $qb->resetDQLPart('select'); 
    foreach ($selectFields as $selectField) { 
     $qb->addSelect($alias . '.' . $selectField); 
    } 
} 

Questo funziona bene quando ho recuperare l'intero insieme in questo modo:

$query = $qb->getQuery(); 
$data = $query->getResult(AbstractQuery::HYDRATE_ARRAY); 

Ma fallisce quando uso l'impaginatore:

$paginator = new Paginator($qb, $fetchJoinCollection = false); 
$total = $paginator->count(), 
$data = $paginator->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY) 

ottengo l'errore:

Not all identifier properties can be found in the ResultSetMapping: relationID
\vendor\doctrine\orm\lib\Doctrine\ORM\Query\Exec\SingleSelectExecutor.php(38)

Domanda: Perché il Paginator riuscire quando seleziono solo campi specifici?
Sto trascurando qualcosa? O sto sbagliando tutto insieme?

+1

uomo, mi sento così così ... https://xkcd.com/979/ – yivi

risposta

-1

Doctrine sta cercando di idratare una relazione delineata dal file YAML, utilizzando un campo che non esiste perché l'hai escluso dall'istruzione SELECT. Dai un'occhiata al tuo file di mappatura per capire cosa è necessario aggiungere di nuovo.

Penso che si stia lamentando solo con l'impaginatore perché il campo non è accessibile (e quindi non è pigro-caricato) quando si non usare l'impaginatore.

Come parte (e con zero comprensione del tuo stack, quindi YMMV) eviterei di prendere l'abitudine di SELECT set di risultati ridotti, poiché ti troverai continuamente in problemi insoliti come questo. Se hai bisogno di prestazioni extra, sarebbe meglio mettere in atto un buon vecchio strato di caching ...

0

sto usando questa soluzione.

utilizzare lo dichiarazioni

use Zend\Paginator\Paginator; 
use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as DoctrineAdapter; 
use Doctrine\ORM\Tools\Pagination\Paginator as ORMPaginator; 

nella vostra azione

$viewModel = new ViewModel(); 

$entityManager = $this->getServiceLocator() 
    ->get('Doctrine\ORM\EntityManager'); 

$queryBuilder = $entityManager 
    ->createQueryBuilder(); 
$queryBuilder->add('select', new Expr\Select(array('t.id', 't.name'))); 
$queryBuilder->add('from', 'Application\Entity\Table t'); 

$adapter = new DoctrineAdapter(
    new ORMPaginator(
     $queryBuilder 
    ) 
); 
$paginator = new Paginator($adapter); 
$paginator->setDefaultItemCountPerPage(20); 

$page = (int)$this->params()->fromQuery('page'); 
if($page) $paginator->setCurrentPageNumber($page); 

$viewModel->results = $paginator; 

return $viewModel;