コード例 #1
0
 /**
  * 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);
 }
コード例 #2
0
 /**
  * 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());
 }