Я встречаю странную проблему с Доктриной.
Мне нужно запросить простую таблицу с одним внутренним соединением, которое я уже делал много раз. Но в этом случае что-то странно: пропущено много строк.
У меня есть объект под названием «Политика». Он связан с таблицей в моей базе данных Oracle. В этой таблице содержится 81k + строк. Когда вы запрашиваете этот объект с помощью конструктора запросов Doctrine, я получаю только 5k результатов. Я сделал этот запрос максимально простым для тестирования:
$qb = $em->createQueryBuilder(); $qb->select('p')->from('ErwMonitoringExtranetBundle:Policy', 'p'); $query = $qb->getQuery(); $policiesFull = $query->getResult();
Переменная $ policyFull содержит только 5k элементов. В таблице нет дубликатов.
SQL-запрос, созданный Doctrine, выглядит следующим образом:
SELECT r0_.node_group_name AS NODE_GROUP_NAME0, r0_.policy_name AS POLICY_NAME1, r0_.policy_description AS POLICY_DESCRIPTION2, r0_.policy_group_name AS POLICY_GROUP_NAME3, r0_.policy_type_name AS POLICY_TYPE_NAME4, r0_.policy_name_on_agent AS POLICY_NAME_ON_AGENT5, r0_.date_last_maj AS DATE_LAST_MAJ6, r0_.om_name AS OM_NAME7, r0_.id_node AS ID_NODE8 FROM ewintranet.ref_monitored_ci;
Выполнение того же точного запроса в Oracle возвращает полное содержимое таблицы.
Подсчет результатов с помощью запроса доктрины возвращает правильное количество строк:
$qb = $em->createQueryBuilder(); $qb->select('count(p)')->from('ErwMonitoringExtranetBundle:Policy', 'p'); $query = $qb->getQuery(); echo $query->getSingleScalarResult();
Это возвращает 81k.
Кто-нибудь знает, почему все эти строки исчезают после использования getResult ()?
Это то, что я сделал бы:
createQuery
или createNativeQuery
Если со всеми тремя методами вы получите ту же проблему, это может быть проблемой с ограничением данных. Я бы начал с параметров max_execution_time
и memory_limit
в php.ini
Я также нашел некоторые ограничения на оракулы, которые могут быть установлены на: oci8.statement_cache_size в php.ini или в файле oraaccess.xml в каталоге Oracle. Это также важно, если вы используете APC для кеширования запросов.
В любом случае, что говорит app_dev.php?
Хорошо, я узнал, что вызвало мою проблему. Первичный идентификатор был неправильным в моей декларации Entity.
В таблице oracle был составлен первичный ключ, тогда как в моей сущности идентификатор был только на одном столбце. GetResult делал DISTINCT в этом столбце.