Doctrine QueryBuilder обрезает результат, когда я использую orderBy - PullRequest
0 голосов
/ 12 июня 2018

У меня есть большой метод репозитория, который генерирует регулярный запрос в бэкэнде, некоторые параметры, которые я передаю этому методу репозитория, это max-results, firs-result, order-by и order-by-dir для контроляобщее количество записей для отображения, нумерация страниц и порядок записей.Проблема в том, что когда я в какой-то конфигурации, например (4-я страница, макс-результаты: 10, первый-результат: 40), это должно дать мне от 40-го до 50-го записи +1000 записей в базе данных, но только возвращает -10 записейиз +1000 записей.

Код QB

....
return $total ? //this is a bool parameter to find out if I want the records or the records amount
                $qb
                    ->select($qb->expr()->count('ec.id'))
                    ->getQuery()->getSingleScalarResult() :
                $qb//these are the related entities all are joined by leftJoin of QB
                    ->addSelect('c')
                    ->addSelect('e')
                    ->addSelect('pr')
                    ->addSelect('cl')
                    ->addSelect('ap')
                    ->addSelect('com')
                    ->addSelect('cor')
                    ->addSelect('nav')
                    ->addSelect('pais')
                    ->addSelect('tarifas')
                    ->addSelect('transitario')
                    ->orderBy(isset($options['sortBy']) ? $options['sortBy'] : 'e.bl', isset($options['sortDir']) ? $options['sortDir'] : 'asc')
                    ->getQuery()
                    ->setMaxResults(isset($options['limit']) ? $options['limit'] : 10)
                    ->setFirstResult(isset($options['offset']) ? $options['offset'] : 0)
                    ->getArrayResult();

Сценарий 1: QueryBuilder с orderBy и базой данных

QB: В этом случае результатом является только один объект с ожидаемыми данными, но только один объект, а не 10, когда существует более 1000 записей DB: В этом случае я получаю 10 записей, но ста же сущность (тот же вывод из QB, но повторяется 10 раз)

Сценарий 2: QueryBuilder без orderBy и базы данных

QB: В этомесли результат соответствует ожидаемым 10 записей, отфильтрованных из +1000 записей

DB: В этом случае результат соответствует ожидаемым 10 записей

Единственная проблема в этом сценариичто я не могу заказать свои результаты, используя QB.

EnviroОписание

  • Symfony: 3.4.11
  • PostgeSQL: 9.2
  • PHP 7.2
  • ОС: Ubuntu Server 16.04 x64

Почему доктрина / postgres дают мне такой результат?

Исключений нет, пропущенные конфигурации - это только результаты, когда я использую orderBy

Заранее спасибо!

1 Ответ

0 голосов
/ 23 июня 2018

Начиная с комментариев, публикующих это как ответ


Я полагаю, это потому, что вы выбираете связанные объекты с помощью левого соединения, так что вы будете получать несколько результатов на основную сущность (из-за одного или многих отношений)но не в отсортированном виде, но когда вы выполняете упорядочение по набору результатов, дубликаты отображаются в одной строке. В отсутствие порядка по дубликаты все еще были там, но не в той же строке, что и несортированные результаты, поэтому вы незаметил / расценил их как дублирующую запись.

То, что я думаю в качестве обходного пути для вашего случая, состоит в том, чтобы выбрать только ваш основной объект, позволяющий A в построителе запросов не выбирать связанные addSelect(...) и использовать отложенная загрузка, если вы хотите отобразить желаемые результаты от связанных объектов.

...