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
});
Другие вопросы по тегам