Символическая доктрина

У меня есть пользователи сущностей, пример count 90355, и мне нужно получить 100 пользователей и сделать что-то логическое с этим пользователем. то следующие 100 использования, это у меня есть, но когда я нахожу, что на моем сервере выпадающее меню, как решить эту проблему?

public function find() { $developers = $this->em->getRepository('ArtelProfileBundle:Users')->findBy(array(), array('id' => 'desc')); foreach ($developers as $developer) { $this->getApiFullContact($developer); } return true; } 

Я думаю, что эта функция, но переменная setFirstResult и setMaxResults?

  public function getPaginationUser() { $qb = $this->getEntityManager()->createQueryBuilder('d'); $qb ->select('d') ->from('ArtelProfileBundle:Users', 'd') ->setFirstResult(0) ->setMaxResults(100) ->orderBy('d.id', 'DESC') ->getQuery() ->getResult() ; $query = $qb->getQuery(); $results = $query->getResult(); return $results; } 

как эта итерация?

Это не проверено, но я думаю, что это должно работать:

 public function find($offset = 0) { $developers = $this->em->getRepository('ArtelProfileBundle:Users')->findBy(array(), array('id' => 'desc'), 100, $offset); foreach ($developers as $developer) { $this->getApiFullContact($developer); } if (count($developers) < 100){ $offset = $offset + 100; $this->find($offset) } return new Response("finished!"); } 

Здесь приведен полный рабочий пример -> Использование ограничения и смещения в построителе запросов доктрины для ручного разбиения на страницы . Я просто даю вам коды, которые вам нужно понять в первую очередь.

Вот как это работает, и для меня это лучшая практика! Может быть, не для всех!

  1. Запрос отправляется Контроллеру
  2. Контрольные вызовы Сервис
  3. Параметры нормализованного запроса службы с помощью Trait
  4. Служба извлекает данные из репозитория
  5. Репозиторий возвращает результат обратно в Service
  6. Сервис передает результат на завод
  7. Завод создает модель результата
  8. Возврат к заводской версии
  9. Возвращает результат работы Model back to Controller

репо

 namespace Application\BackendBundle\Repository; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query; class StudentRepository extends EntityRepository { /** * @param string|null $name * @param int $limit * @param int $offset * * @returns array */ public function findPaginatedByName($name, $limit, $offset) { $qb = $this->createQueryBuilder('s'); if ($name) { $qb->where('s.name = :name')->setParameter('name', $name); } $qb->setMaxResults($limit)->setFirstResult($offset); return $qb->getQuery()->getResult(Query::HYDRATE_SIMPLEOBJECT); } /** * @param string|null $name * * @return int */ public function findPaginatedByNameCount($name) { $qb = $this->createQueryBuilder('s')->select('COUNT(s)'); if ($name) { $qb->where('s.name = :name')->setParameter('name', $name); } return $qb->getQuery()->getResult(Query::HYDRATE_SINGLE_SCALAR); } } 

PAGER TRAIT

 namespace Application\BackendBundle\Util; trait PagerTrait { public function getPage($page = 1) { if ($page < 1) { $page = 1; } return floor($page); } public function getLimit($limit = 20) { if ($limit < 1 || $limit > 20) { $limit = 20; } return floor($limit); } public function getOffset($page, $limit) { $offset = 0; if ($page != 0 && $page != 1) { $offset = ($page - 1) * $limit; } return $offset; } } 

ОКАЗАНИЕ УСЛУГ

 namespace Application\BackendBundle\Service; use Application\BackendBundle\Factory\StudentFactoryInterface; use Application\BackendBundle\Model\Student\Result; use Application\BackendBundle\Repository\StudentRepository; use Application\BackendBundle\Util\PagerTrait; class StudentService implements StudentServiceInterface { use PagerTrait; private $studentRepository; private $studentFactory; public function __construct( StudentRepository $studentRepository, StudentFactoryInterface $studentFactory ) { $this->studentRepository = $studentRepository; $this->studentFactory = $studentFactory; } /** * @param string $name * @param int $page * @param int $limit * * @return Result */ public function get($name, $page, $limit) { $page = $this->getPage($page); $limit = $this->getLimit($limit); $offset = $this->getOffset($page, $limit); $total = 0; $result = $this->studentRepository->findPaginatedByName($name, $limit, $offset); if ($result) { $total = $this->studentRepository->findPaginatedByNameCount($name); } return $this->studentFactory->createStudentResult($result, $name, $page, $limit, $total); } }