Doctrine分页器

5
我遇到了Doctrine Paginator的问题。
在我的仓库中,我有一个函数来检索特定的数据集。 我使用querybuilder进行此操作:
{myEntityRepository}->createQueryBuilder($alias)

为了仅选择特定的字段,我使用以下方法:
if (count($selectFields) > 0) {
    $qb->resetDQLPart('select');
    foreach ($selectFields as $selectField) {
        $qb->addSelect($alias . '.' . $selectField);
    }
}

当我像这样检索整个集时,它可以正常工作:

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

但是当我使用分页器时它失败了:

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

我遇到了以下错误:

未在ResultSetMapping中找到所有标识符属性:relationID
\vendor\doctrine\orm\lib\Doctrine\ORM\Query\Exec\SingleSelectExecutor.php(38)

问题: 当我只选择特定字段时,分页器为什么会失败?
我是不是忽略了什么?还是我完全做错了?


1
伙计,我感觉就是这样... https://xkcd.com/979/ - yivi
2个回答

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;

-1

Doctrine试图通过您的YAML文件中概述的关系来填充内容,但使用了一个不存在的字段,因为您已将其从SELECT语句中排除。查看您的映射文件以确定需要添加什么。

我认为它只与Paginator发生冲突是因为在不使用Paginator时,该字段未被访问(因此未被延迟加载)。

顺便说一句(并且完全不了解您的堆栈,所以您的情况可能有所不同),我会避免经常SELECT减少结果集,因为您会一直遇到这样的奇怪问题。如果确实需要额外的性能,最好放置缓存层...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接