2013-08-27 30 views
5

Doctrine Paginatorに問題が発生しました。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 = 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

マンで

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

を追加 – yivi

答えて

-1

Doctrineは、あなたがSELECTステートメントから除外したために存在しないフィールドを使用して、YAMLファイルによって示された関係を水和させようとしています。

マッピングファイルを調べて、フィールドがアクセスされていないため(遅延ロードされていないため)、Paginatorに不満があると思うでしょう。 Paginatorを使用しないでください。

脇の下として(あなたのスタックを理解していないので、YMMV)、私はSELECTの結果セットを減らすことを避けたいと思います。このような奇妙な問題にぶち当たっています。余分なパフォーマンスが必要な場合は、適切な古いキャッシングレイヤーを配置する方がよいでしょう...

0

私はこのソリューションを使用しています。

、私はこのようなそう感じる... https://xkcd.com/979/ use文をあなたの行動

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