1

前言:我的脚本有点复杂,所以我尝试将复杂性降低到一个简单的示例。

假设我们有一个实体“公司”。我们还有一个如下所示的存储库功能:

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 不是全局单例对象吗?)
  • 我知道,当我在使用 createQuery 之前使用 flush() 保存数据时,结果会很好。但是我不能在这里保存数据,因为那样整个过程就不会发生在事务中。
  • 我也无法操纵 createQuery 的 where 部分来排除已删除的公司,因为整个过程被分成许多功能,并且很难在整个过程中传输带有已删除公司的数组。

问题:我怎样才能通过 createQuery 获得没有删除的公司?

4

1 回答 1

0

你可以像下面这样包装你的代码,使你的整个过程都在一个事务中。这样,您可以在删除数据后立即刷新。

$this->getEntityManager()->transactional(function($em) {
   // put your code here
   // $em is instanceof EntityManager
});
于 2015-09-11T09:42:02.653 回答