doctrine 接口DoctrineCommonPersistenceObjectManager
将flush
方法定义为没有参数。然而,实现DoctrineORMEntityManager
允许传递单个实体。
除了,IMO,糟糕的编程风格,这有什么我需要担心的吗?
我知道如果 PHP 没有在方法中声明任何额外的参数,它们就会忽略。这将导致非ORM管理器刷新所有实体。
我问是因为我正在尝试以这样一种方式编写我的代码,即 ORM 是可配置的并且可以在以后切换。现在,在编写批处理导入类时,我发现在没有实体的情况下调用flush
会导致内存泄漏,它还会影响我在主导入循环之外使用的"进度/历史记录"实体。因此,我只刷新某些实体非常重要。
我也注意到flush()
的定义和实现之间的差异。这可能是一个只有教义的制定者才能回答的问题。
简答题
别担心。
长答案
我们仍然可以解决差异以及它们如何影响您的应用程序。
根据 doctrine 的文档,flush()
是唯一可以保留对域对象更改的方法。其他方法(如 persist()
和 remove()
仅将该对象放在要更新的队列中。
了解只有 EntityManager#flush(( 会导致对数据库执行写入操作非常重要。任何其他方法(如 EntityManager#persist($entity( 或 EntityManager#remove($entity( 仅通知 UnitOfWork 在刷新期间执行这些操作。 不调用 EntityManager#flush(( 将导致该请求期间的所有更改丢失。
性能
一次刷新单个实体本身可能会导致性能问题。每个flush()
都是对数据库的新访问。对flush()
的大量调用可能会降低应用程序的速度。
flush()
方法不应影响进度/历史记录实体,除非您有意对其进行更改。但是,如果是这种情况,并且您仍然不希望在执行flush()
时更新进度/历史记录实体,则可以将实体与原则分离。这将允许您对实体进行更改,而无需学说知道这些更改。因此,它不会受到flush()
的影响。
当您准备好将实体重新附加到原则时,您可以使用实体经理提供的合并方法。然后最后一次调用flush()
以合并更改。