2013-08-27 95 views
5

我遇到了Doctrine分頁器的問題。學說分頁器

在我的倉庫中,我有一個函數來檢索特定的數據集。 我使用QueryBuilder的這個:

{myEntityRepository}->createQueryBuilder($alias) 

爲了只選擇我使用特定字段的內容:

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

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

當我取回一整套這樣也能正常工作

但是,當我使用paginator時它失敗:

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

我得到的錯誤:

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

問題:爲什麼當我只選擇特定字段的分頁程序失敗?
我可以俯視嗎?還是我一起做錯了?

+1

人,我覺得這樣這樣...... https://xkcd.com/979/ – yivi

回答

-1

學說試圖通過您YAML文件概述的關係,使用不存在的字段,因爲您已將其從SELECT語句中排除。看看你的映射文件,找出你需要添加回來。

我會認爲它只是抱怨Paginator,因爲該字段沒有被訪問(因此不是懶惰加載),當你不要使用Paginator。因爲你會發現自己一直在遇到類似奇怪的問題。作爲旁白(並且沒有理解你的堆棧,所以YMMV),我會避免養成減少結果集的習慣,因爲你會發現自己會一直遇到這樣的奇怪問題。如果你確實需要額外的性能,你最好放置一個良好的舊緩存層...

0

我正在使用此解決方案。

添加使用語句

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

在你的行動

$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;