不推荐使用参数调用 Doctrine clear()

Jon*_*han 5 doctrine entitymanager symfony

教义建议——

自 Doctrine/persistence 1.3 起,不推荐使用任何参数调用 Doctrine\ORM\EntityManager::clear() 来清除特定实体,并将在 2.0 中删除。

我们的 Symfony 代码库中有很多参考资料->clear(SpecificEntity::class),并且正在寻求更新这些内容,但我们正在努力在最新的升级指南中找到建议的替代方案。

在最新版本的 Doctrine 中是否有推荐的替代方案来清除特定实体?

dbr*_*ann 6

调用clear($entity)有一些副作用和不明确的行为,例如该实体中/与该实体的关系会发生什么?这个想法是,你的工作单元(Doctrine 跟踪的内存中的更改,直到你点击刷新)应该很小,并且只包含你想要更改的实体,以避免保存/清除内容的不确定性。与其取出该实体,不如将其放在首位。相反,它可以获得自己的刷新“循环”,然后清除整个工作单元,以表明这些更改独立于其他更改。

有多种方法可以做到这一点,最常见的(我认为)是:

更频繁地使用clear()(没有特定实体)。

这可能要求您确保对实体的所有更改都紧密分组在一起,以确保不会对其他实体进行意外写入。您可能还需要更频繁地重新读取数据。为了弥补这一点,您应该使用二级缓存。

使用不同的变更跟踪策略

默认情况下,所有更改都会隐式跟踪并保留。相反,您可以告诉 Doctrine 仅编写显式更改。这意味着,例如,当您有一个拥有多个地址的用户并且您仅拨打 时persist($user),则不会保存关联的地址更改。相反,您必须手动对应保存的每个地址调用 persist 。您不必经常调用clear,因为您明确说明了应该保留哪些实体更改。


这两个选项都需要您重新组织业务逻辑,这使得很难为此提供通用的升级指南。一般来说,原因和解决方案与flush($entity)文档中的部分描述非常相似:https ://github.com/doctrine/orm/blob/master/UPGRADE.md#bc-break-removed-实体管理器冲刷实体和实体管理器冲刷实体