Использование конструктора запросов стандартного менеджера Symfony3, я создать этот запрос:Doctrine2 неправильно кэширует результат запроса
$anagrafica = $em->createQueryBuilder()
->select("a, rel, a2")
->from("AppBundle\Entity\Anagrafica\anagrafica", "a")
->leftJoin("a.relazioniDa", "rel")
->leftJoin("rel.anagrafica_figlio", "a2")
->where("a.stato = :actStatus")
->andWhere("a = :anagrafica")
->andWhere($em->createQueryBuilder()->expr()->orX("a.id = :id", "a2.id = :id"))
->setParameter("anagrafica", $anagraficaInserente)
->setParameter("actStatus", $actStatus)
->setParameter("id", $id)
->getQuery()->getResult();
Это в основном выбирает «а», родительский объект, а «а2», дочерний объект; оба они принадлежат к одному классу.
Когда я запускаю этот запрос, используя 2 в качестве параметра «id», запрос корректно увлажняет результаты, возвращая мне единственный результат, где a.id = 1 и a.id = 2.
Сразу после этого я повторно запускаю запрос 3 в качестве id; на этот раз результат должен быть одним, где a.id = 1 и a2.id = 3, но фактический результат тот же, что и при id = 2.
Если я только запускаю запрос, где id = 3, результат, опять же, правильно гидратируется.
Мое лучшее предположение состоит в том, что доктрина кэширует результат и по какой-то причине фактически не выполняет запрос при изменении идентификатора (несмотря на то, что дамп параметра показывает правильное значение в поле id);
Поиск в Интернете очень слабых результатов; я нашел старые (и исправленные) сообщения об ошибках об этом, и любое отключение кэша от запроса не принесло никаких улучшений.
Я могу просто решить проблему, только вытаскивая основную сущность, а затем вручную просматривая дочерние, но мне бы очень хотелось узнать, есть ли способ локально отключить кеш или какой-либо другой вид db-side.
EDIT: У меня эта проблема в тестовой среде; 2 запроса выполняются в 2 разных (но последовательных) вызовах функций
Вы перестраиваете полный запрос с помощью построителя запросов или повторно используете первый объект запроса? – aferber
Я полностью перестраиваю запрос; я предоставил дополнительную информацию, отредактировав вопрос – Vkfan
Вы можете изменить строку с помощью '-> orX' в' -> andWhere ('a2.id =: id') '.Как ваш запрос написан, OR пытается выбрать все кортежи '(a, a2)', где либо 'a', либо' a2' имеет id ': id'. Единственная причина, по которой вы получаете результат с помощью 'a.id == 1', заключается в том, что ваш запрос также содержит' -> andWhere ("a =: anagrafica") '. В основном, в выражениях SQL вы запрашиваете '... AND a.id = 1 AND (a.id = 2 OR a2.id = 2) ...'. Очевидно, что 'a.id = 2' никогда не может применяться, поскольку это противоречит' a.id = 1'. – aferber