У меня есть пользователи сущностей, пример 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!"); }
Здесь приведен полный рабочий пример -> Использование ограничения и смещения в построителе запросов доктрины для ручного разбиения на страницы . Я просто даю вам коды, которые вам нужно понять в первую очередь.
Вот как это работает, и для меня это лучшая практика! Может быть, не для всех!
репо
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); } }