Ошибка кэширования результатов доктрины с условием LEFT JOIN ... WITH - PullRequest
0 голосов
/ 17 февраля 2012

Я стремлюсь найти ответы, прежде чем мне нужно разместить здесь вопрос, но сегодня я не могу понять, что не так.

Мы используем Doctrine 2.1.2 в приложении Symfony 2, а в репозитории у нас есть два метода, которые используют практически один и тот же запрос. Единственное различие между методом A и методом B состоит в том, что в JOIN добавлено условие, общее для обоих запросов.

Проблема в том, что Doctrine, похоже, использует один и тот же кэш результатов для обоих запросов. Когда мы вызываем метод A, метод B использует кэш из A, и наоборот.

Я использовал expireResultCache (true) и useResultCache (false), но безрезультатно.

Вот как выглядят запросы:

-- method A

SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id
LEFT JOIN a.fkObjectB b
LEFT JOIN a.fkObjectC c

-- method B
SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id
LEFT JOIN a.fkObjectB b WITH b.some_field IS NULL
LEFT JOIN a.fkObjectC c

Когда я использую getSQL (), я вижу, что они приводят к различным запросам, как и ожидалось. Сгенерированные запросы, когда они выполняются независимо в базе данных, генерируют разные результаты.

Это наводит меня на мысль, что это может быть досадная ошибка кэширования результатов, когда Doctrine не кэширует условия для JOIN, а только имена таблиц.

Это ошибка, или я могу что-то сделать?

РЕДАКТИРОВАТЬ Все еще происходит в Учении 2.1.6.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2012

Просто чтобы расширить комментарий Мишеля В. , Doctrine 2 извлекает один и тот же экземпляр объекта оба раза через шаблон карты идентификации .

Призвание:

EntityManager#clear()

очищает карту идентификации и вынуждает EntityManager получить свежую копию объекта из базы данных.

0 голосов
/ 17 февраля 2012

Я думаю, что ваша проблема решена в Доктрине 2.2. У меня похожая проблема, связанная с кэшем результатов, и вот мой вопрос и ответы .

...