2014-12-04 5 views
4

У меня возникла странная проблема с Doctrine.Отсутствие строк при запросе таблицы с помощью Doctrine (Symfony2)

Мне нужно запросить простую таблицу с одним внутренним соединением, которое я уже делал много раз. Но в этом случае что-то странно: пропущено много строк.

У меня есть объект, называемый политикой. Он связан с таблицей в моей базе данных Oracle. В этой таблице содержится 81k + строк. Когда вы запрашиваете этот объект с помощью конструктора запросов Doctrine, я получаю только 5k результатов. Я поставил этот вопрос как можно более простым для тестирования:

$qb = $em->createQueryBuilder(); 
$qb->select('p')->from('ErwMonitoringExtranetBundle:Policy', 'p'); 
$query = $qb->getQuery(); 
$policiesFull = $query->getResult(); 

В переменной $ policy Полная переменная содержит только 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()?

+1

Внутреннее соединение дает только результаты, соответствующие записи в обеих таблицах. – pietro

+0

Каждая строка соответствует :) – Robou

+0

У вас был запрограммированный запрос? поэтому попробуйте выполнить его непосредственно в базе данных. – pietro

ответ

0

Это то, что я хотел бы сделать:

  1. Проверьте результат с помощью createQuery или createNativeQuery
  2. Выполнить запрос от простой PHP скрипт вне Symfony

Если все 3 метода вы получаете та же проблема, то это может быть проблема с размером ограничения данных. Я хотел бы начать с max_execution_time и memory_limit установок в php.ini

я нашел также некоторые ограничения оракула, которые могут быть установлены на: oci8.statement_cache_size в php.ini или в файле oraaccess.xml в каталоге Oracle. Это также важно, если вы используете APC для кеширования запросов.

В любом случае, что скажет app_dev.php?

+0

Я уже пробовал использовать createNativeQuery, и я правильно все мои строки. Это мое резервное решение, если я действительно не могу заставить построитель запросов работать здесь. Я теперь попробовал createQuery, и я получаю такое же количество строк, которые получаю с построителем запросов. – Robou

0

Хорошо, я узнал, что вызывало мою проблему. Первичный идентификатор был неправильным в моей декларации Entity.

В таблице оракула был составлен первичный ключ, в то время как в моей сущности идентификатор был только на одном столбце. GetResult делал DISTINCT в этом столбце.

Смежные вопросы