Использование нумерации страниц в Doctrine2 / Symfony2 без расширения пагинатора Doctrine - PullRequest
11 голосов
/ 06 марта 2012

Я использую Doctrine2 для проекта, который может получить большой трафик, и я неплохо делаю нумерацию страниц на странице поиска, и я получаю только 5 результатов на страницу. Так есть ли хороший способ сделать это безНужно использовать расширение доктрины и сохранить уровень абстракции ORM?Я имею в виду, я не хочу писать какие-либо формы запросов dql и держать свой код в этом формате:

 $repo= $this->getDoctrine()
                    ->getEntityManager()
                    ->getRepository('AcmeOfficeBundle:Project');
        $list=$repo->findBy(array('PROJ_private' => "0"));

Ответы [ 3 ]

36 голосов
/ 06 марта 2012

Doctrine 2.2 поставляется с нумератором страниц .Однако требует от вас написания DQL-запросов.

Если вы настаиваете на том, чтобы не писать никаких DQL, вы можете начать с просмотра класса Doctrine EntityRepository;в частности, метод findBy () .Он имеет необязательные параметры для предела и смещения, так что вы можете попробовать что-то вроде этого (используя ваш пример в качестве базовой линии):

$num_pages = x; // some calculation of what page you're currently on
$repo = $this->getDoctrine()
                ->getRepository('AcmeOfficeBundle:Project');
$list = $repo->findBy(
    array('PROJ_private' => "0"), //search criteria, as usual
    array(/* orderBy criteria if needed, else empty array */),
    5, // limit
    5 * ($num_pages - 1) // offset
);
1 голос
/ 29 июля 2015

В Doctrine ORM 2.3 вы также можете использовать Criteria вместе с matching в хранилище сущностей. Который сейчас (с 2.5) работает с отношениями nToMany.

Это помогает, когда ваш запрос требует другого сравнения, отличного от equals, или при разбивке на страницы коллекции OneToMany другой сущности.

$page = (isset($_GET['page']) && $_GET['page'] > 0 ? $_GET['page'] : 1);
$limit = 20;
$offset = ($limit * ($page - 1));
$criteria = \Doctrine\Common\Collections\Criteria::create()
    ->setMaxResults($limit)
    ->setFirstResult($offset);
$expr = $criteria->expr();
$user = $em->getRepository('AcmeOfficeBundle:Project')
    ->matching($criteria->where($expr->gt('PROJ_private', 0)));
$total_records = $user->count();

http://doctrine -orm.readthedocs.org / о / последняя / ссылка / рабочий-с associations.html # фильтровальной-коллекция

0 голосов
/ 15 мая 2014

Хороший вариант, позволяющий избежать написания DQL, - это работать с коллекциями, используя Pagerfanta

https://github.com/whiteoctober/Pagerfanta

use Pagerfanta\Adapter\DoctrineCollectionAdapter;
$user = $em->find("App\DoctrineORM\User", 1);
$adapter = new DoctrineCollectionAdapter($user->getGroups());
...