/** * Generates the paginated resultset * * @param ItemsEvent $event */ public function items(ItemsEvent $event) { $query = $event->getQuery(); $distinct = $event->isDistinct(); $result = null; if ($distinct) { $limitSubQuery = QueryHelper::cloneQuery($query); $limitSubQuery->setParameters($query->getParameters()); QueryHelper::addCustomTreeWalker($limitSubQuery, self::TREE_WALKER_LIMIT_SUBQUERY); $limitSubQuery->setFirstResult($event->getOffset())->setMaxResults($event->getRowCountPerPage()); $ids = array_map('current', $limitSubQuery->getScalarResult()); // create where-in query $whereInQuery = QueryHelper::cloneQuery($query); QueryHelper::addCustomTreeWalker($whereInQuery, self::TREE_WALKER_WHERE_IN); $whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids))->setFirstResult(null)->setMaxResults(null); foreach ($ids as $i => $id) { $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS . '_' . ++$i, $id); } $result = $whereInQuery->getResult(); } else { $query->setFirstResult($event->getOffset())->setMaxResults($event->getRowCountPerPage()); $result = $query->getResult(); } $event->stopPropagation(); $event->setItems($result); }
/** * Generates the paginated resultset * * @param ItemsEvent $event */ public function items(ItemsEvent $event) { $query = $event->getQuery(); $type = $query->getType(); if ($type !== Query::TYPE_FIND) { throw new UnexpectedValueException('ODM query must be a FIND type query'); } $reflClass = new \ReflectionClass('Doctrine\\MongoDB\\Query\\Query'); $reflProp = $reflClass->getProperty('query'); $reflProp->setAccessible(true); $queryOptions = $reflProp->getValue($query); $queryOptions['limit'] = $event->getRowCountPerPage(); $queryOptions['skip'] = $event->getOffset(); $resultQuery = clone $query; $reflProp->setValue($resultQuery, $queryOptions); $cursor = $resultQuery->execute(); $event->stopPropagation(); $event->setItems($cursor->toArray()); }