教义冲洗单一实体


doctrine flush a single entity

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

除了,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()以合并更改。