Как ограничить результаты по основной сущности, а не по детям? - PullRequest
0 голосов
/ 02 июля 2018

Как ограничить результаты по основной сущности, а не по детям?

Если я это сделаю:

    $queryBuilder = $em->createQueryBuilder();

    $queryBuilder->select('n, c');
    $queryBuilder->from('AppBundle:News', 'n');
    $queryBuilder->leftJoin('n.comments', 'c');
    $queryBuilder->setMaxResults(3);

    $results = $queryBuilder->getQuery()->getResult();

И сначала News имеет, например, 3 комментария, затем результаты возвращают мне только одну запись News. Если у меня нет комментариев или я удаляю leftJoin, то это работает хорошо.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Доктрина может вести себя неожиданно с соединениями, множеством мест и нумерацией страниц.

Рекомендуется использовать Paginator, а не напрямую вызывать getResults. Пагинатор обрабатывает группирование результатов по основному объекту.

Редактировать: предоставить пример кода:

<?php
use Doctrine\ORM\Tools\Pagination\Paginator;

$dql = "SELECT p, c FROM BlogPost p JOIN p.comments c";
$query = $entityManager->createQuery($dql)
                       ->setFirstResult(0)
                       ->setMaxResults(100);

$paginator = new Paginator($query, $fetchJoinCollection = true);

$c = count($paginator);
foreach ($paginator as $post) {
    echo $post->getHeadline() . "\n";
}

https://www.doctrine -project.org / проекты / Доктрина-ОРМ / ен / 2,6 / учебники / pagination.html

0 голосов
/ 02 июля 2018

Вы используете неверную переменную для своих результатов.

Вы используете $queryBuilder для подготовки своего заявления:

$queryBuilder = $em->createQueryBuilder();

Но для получения результата нужно $qb;

$results = $qb->getQuery()->getResult();
...