Как ограничить результаты основным объектом, а не дочерними?

Как ограничить результаты основным объектом, а не дочерними?

If I do:

    $queryBuilder = $em->createQueryBuilder();

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

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

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


person vosavik    schedule 02.07.2018    source источник
comment
в построителе запросов вы не можете или удалите левое соединение с комментариями и ленивую загрузку ваших данных комментариев, но это приведет к проблеме запросов N + 1   -  person M Khalid Junaid    schedule 02.07.2018
comment
Неправильно понял вопрос о моем первом дублирующемся флаге, но все еще дублирующем stackoverflow.com/questions/5620771/ предлагает решение.   -  person Jenne    schedule 02.07.2018


Ответы (2)


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

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

$queryBuilder = $em->createQueryBuilder();

Но принимая $qb, чтобы получить результат;

$results = $qb->getQuery()->getResult();
person Jim Panse    schedule 02.07.2018
comment
Извините, это была моя ошибка только в stackoverflow. - person vosavik; 02.07.2018

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

Рекомендуемый способ — использовать 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/projects/doctrine-orm/en/2.6/tutorials/pagination.html

person Dimitris    schedule 02.07.2018