У меня есть большой метод репозитория, который генерирует регулярный запрос на бэкэнде, некоторые из параметров, которые я передаю этому методу репозитория, - это max-results, firs-result, order-by и order-by-dir, чтобы контролировать общее количество записи для отображения, разбиение на страницы и порядок записей. Проблема в том, что когда я нахожусь в некоторой конфигурации, например (4-я страница, max-results: 10, first-result: 40), это должно дать мне с 40-й по 50-ю записи из +1000 записей в базе данных, но возвращает только -10 записей от +1000 записей.
QB Code
....
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();
Scenario 1: QueryBuilder with orderBy and database
QB: В этом случае результатом будет только одна сущность с ожидаемыми данными, но только одна сущность, а не 10, если существует более 1000 записей. БД: В этом случае я получаю 10 записей, но с одним и тем же объектом (тот же вывод из QB, но повторяется 10 раз)
Scenario 2: QueryBuilder with out orderBy and database
QB: В этом случае результат - как и ожидалось, 10 записей отфильтрованы из +1000 записей.
БД: В этом случае результат ожидаемый 10 записей
Единственная проблема в этом сценарии заключается в том, что я не могу упорядочить свои результаты с помощью QB.
Environment description
Почему doctrine / postgres дают мне такой результат?
Нет никаких исключений, пропущенные конфигурации, это сокращает результаты только тогда, когда я использую orderBy
да, я сделал getSQL для объекта запроса и выполнил его на сервере; результаты такие, как я описал в моем сообщении
Я предполагаю, что это потому, что вы также выбираете связанные объекты через левое соединение, и я предполагаю, что от одного ко многим в природе вы получаете несколько результатов для каждого объекта с порядком, вы получаете те же записи, в то время как при сравнении в отсутствие порядка записи такие же, но не отсортированные у вас есть повторяющиеся записи из-за присоединений
Да, я уже заметил это, я сделал leftJoin с атрибутом OTM. Проблема в том, что доктрина считает, что все записи повторяются от одного и того же объекта во время процесса гидратации. Проблема никогда не была связана с порядком по, она всегда была с соединением OTM и дублированием результатов; Просто я был так взволнован, что не заметил этой детали. Я просто удалил соединение, и все работало нормально, в другом теперь я получаю информацию о соединении другим способом. Спасибо за комментарий, ответьте на вопрос, если хотите





Как из комментариев, размещающих это как ответ
Я предполагаю, что это потому, что вы выбираете связанные объекты через левое соединение. Таким образом, вы будете получать несколько результатов для каждого основного объекта (из-за одного из многих отношений), но не в отсортированном виде, но когда вы делаете заказ по набору результатов, дубликаты отображаются вверх в той же строке, при отсутствии порядка дубликаты все еще были там, но не в той же строке, что и несортированные результаты, поэтому вы не заметили / не сочли их повторяющейся записью.
В качестве обходного пути для вашего случая я считаю, что выберите только ваш основной объект, позволяющий A в построителе запросов не выбирать связанные объекты addSelect(...) и использовать ленивая загрузка, когда вы хотите отобразить желаемые результаты из связанных объектов.
Вы проверили, что сгенерированный SQL-оператор в профилировщике работает должным образом. Являются ли значения ORDER BY, LIMIT и OFFSET ожидаемыми?