我遇到了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时它失败了:
$paginator = new Paginator($qb, $fetchJoinCollection = false);
$total = $paginator->count(),
$data = $paginator->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY)
我收到错误:
并非所有标识符属性都可以在ResultSetMapping中找到: relationID
\厂商\教义\ ORM \ lib中\学说\ ORM \查询\ Exec的\ SingleSelectExecutor.php(38)
问题:当我只选择特定字段时,为什么分页器会失败?
我忽略了什么吗?或者我一起做错了吗?
答案 0 :(得分: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 :(得分:-1)
Doctrine正在尝试使用您不存在的字段来保持YAML文件概述的关系,因为您已将其从SELECT
语句中排除。查看您的映射文件,找出您需要重新添加的内容。
我认为它只是向Paginator抱怨,因为当你不使用Paginator时,该字段没有被访问(因此不会被延迟加载)。
顺便说一句(并且对你的堆栈没有任何理解,所以YMMV)我会避免养成SELECT
减少结果集的习惯,因为你会发现自己一直遇到像这样的奇怪问题。如果你确实需要额外的性能,那么最好放一个好的旧缓存层......