Twi*_*fty 5 php doctrine doctrine-orm
原则接口Doctrine\Common\Persistence\ObjectManager将flush方法定义为不带参数。但是该实现Doctrine\ORM\EntityManager允许传递单个实体。
除了IMO不良的编程风格外,我还需要担心吗?
我知道,PHP将忽略任何未在方法中声明的额外参数。这将导致非ORM管理器刷新所有实体。
我问是因为我试图以一种可配置的ORM并可以在以后切换的方式编写代码。现在,在编写批处理导入类时,我发现在flush没有实体的情况下进行调用会导致内存泄漏,同时还会影响我在主导入循环之外使用的“进度/历史记录”实体。因此,仅刷新某些实体非常重要。
我也注意到定义和实现之间的差异flush()。这可能是只有学说制定者才能回答的问题。
别担心。
我们仍然可以解决这些差异以及它们如何影响您的申请。
根据学说的文档,flush()这是唯一可以持久保存域对象更改的方法。其他方法,例如persist()并且remove()仅将该对象放入要更新的队列中。
了解只有 EntityManager#flush() 才会导致执行针对数据库的写操作,这一点非常重要。任何其他方法(例如 EntityManager#persist($entity) 或 EntityManager#remove($entity))仅通知 UnitOfWork 在刷新期间执行这些操作。不调用 EntityManager#flush() 将导致该请求期间的所有更改丢失。
一次刷新单个实体本身可能会导致性能问题。每一次flush()都是一次新的数据库之旅。大量的调用flush()可能会减慢您的应用程序的速度。
该flush()方法不应该影响您的进度/历史实体,除非您有意对其进行更改。但是,如果是这种情况,并且您仍然不希望在执行时更新进度/历史实体flush(),则可以将该实体与条令分离。这将允许您对实体进行更改,而学说不知道这些更改。因此,不会受到影响flush()。
当您准备好将实体重新附加到学说时,您可以使用实体经理提供的合并方法。然后flush()最后一次调用来合并更改。
| 归档时间: |
|
| 查看次数: |
3966 次 |
| 最近记录: |