Symfony2 $em->createQuery() также выбирает удаленные объекты
Предисловие: Мой сценарий немного сложен, поэтому я пытаюсь уменьшить сложность до простого примера.
Представьте, что у нас есть сущность "компания". У нас также есть функция репозитория, которая выглядит следующим образом:
public function delete(){
// get company-objects to delete
[...]
// delete some companies
$this->getEntityManager()->remove($company1);
$this->getEntityManager()->remove($company2);
// do other things
[...]
// get companies via createQuery (I really need to do it via
// createQuery because of different reasons that would be too
// complicated to explain for this problem)
$query = $this->getEntityManager()
->createQuery('
SELECT company
FROM MyOwnBundle:Company company
WHERE [...irrelevant...]
');
$companies = $query->getResult();
dump($companies);
exit;
}
Проблема: createQuery также выбирает удаленные компании.
Мои мысли:
- Я думал, что entityManager знает, что компании удаляются, и поэтому не выбирает их в запросе. Но эта мысль была неправильной... (Но почему это так? Разве entityManager не является глобальным одноэлементным объектом?)
- Я знаю, что когда я сохраню данные с помощью flush() перед использованием createQuery, результаты будут хорошими. Но я не могу сохранить данные здесь, потому что тогда весь процесс не будет в транзакции.
- Я также не могу манипулировать частью where в createQuery, чтобы исключить уже удаленные компании, потому что весь процесс разделен на множество функций, и было бы сложно транспортировать массив с удаленными компаниями через весь процесс.
Вопрос: Как я могу получить компании через createQuery без удаленных?
1 ответ
Решение
Вы можете обернуть свой код, как показано ниже, чтобы весь процесс был в транзакции. Таким образом, вы можете очистить сразу после удаления данных.
$this->getEntityManager()->transactional(function($em) {
// put your code here
// $em is instanceof EntityManager
});