doctrine接口Doctrine\Common\Persistence\ObjectManager
将flush
方法定义为没有参数。然而,实现Doctrine\ORM\EntityManager
允许传递单个实体。
除了IMO,糟糕的编程风格,这是我需要担心的吗?
我知道如果没有在方法中声明它们,PHP将忽略任何额外的参数。这将导致非ORM管理器刷新所有实体。
我问,因为我试图以这样的方式编写我的代码,即ORM是可配置的,并且可以在以后切换。现在,在编写批量导入类时,我发现在没有实体的情况下调用flush
会导致内存泄漏,它也会影响进度/历史记录。我在主导入循环之外使用的实体。所以我只刷新某些实体非常重要。
答案 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()
来合并更改。