doctrine冲洗单个实体

时间:2016-04-17 22:47:50

标签: php doctrine-orm doctrine

doctrine接口Doctrine\Common\Persistence\ObjectManagerflush方法定义为没有参数。然而,实现Doctrine\ORM\EntityManager允许传递单个实体。

除了IMO,糟糕的编程风格,这是我需要担心的吗?

我知道如果没有在方法中声明它们,PHP将忽略任何额外的参数。这将导致非ORM管理器刷新所有实体。

我问,因为我试图以这样的方式编写我的代码,即ORM是可配置的,并且可以在以后切换。现在,在编写批量导入类时,我发现在没有实体的情况下调用flush会导致内存泄漏,它也会影响进度/历史记录。我在主导入循环之外使用的实体。所以我只刷新某些实体非常重要。

1 个答案:

答案 0 :(得分:1)

我也注意到flush()的定义和实现之间的差异。这可能只是一个问题,只有学说的开发者才能回答。

简答

不要担心。

长答案

我们仍然可以解决差异以及它们如何影响您的应用程序。

根据学说的文档,flush()是唯一可以持久更改域对象的方法。 其他方法(例如persist()remove())仅将该对象放入队列中进行更新。

  

了解只有EntityManager#flush()才能执行针对数据库的写操作,这一点非常重要。任何其他方法(如EntityManager#persist($ entity)或EntityManager #remove($ entity))仅通知UnitOfWork在刷新期间执行这些操作。   不调用EntityManager#flush()将导致该请求丢失期间的所有更改。

效果

一次刷新单个实体可能会导致性能问题。每个flush()都是数据库的新旅程。拨打flush()的大量电话可能会降低您的申请速度。

flush()方法不应影响您的进度/历史记录实体,除非您有意对其进行更改。 ,如果是这种情况,并且您仍然不希望在执行flush()时更新进度/历史记录实体,则可以从原则detach the entity进行更新。这将允许您在没有学说知道这些更改的情况下对实体进行更改。因此,它不会受flush()影响。

当您准备好将实体重新附加到学说时,您可以使用实体经理提供的the merge method。然后最后一次调用flush()来合并更改。