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

Calling Doctrine clear() with an argument is deprecated

学说建议-

Calling Doctrine\ORM\EntityManager::clear() with any arguments to clear specific entities is deprecated since doctrine/persistence 1.3 and will be removed in 2.0.

我们的 Symfony 代码库中有很多对 ->clear(SpecificEntity::class) 的引用,并且正在寻求更新这些,但我们正在努力在最新的 upgrade guide.[=13 中找到建议的替代品=]

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

调用 clear($entity) 有一些副作用和不明确的行为,例如那个实体的关系 in/to 会怎样?这个想法是,你的工作单元(Doctrine 跟踪内存中的变化,直到你刷新)应该很小并且只包含你想要改变的实体,以避免正在发生的事情的不确定性saved/cleared。而不是取出实体,它首先不应该在那里。相反,它可以例如获得自己的 flush-"cycle",然后清除整个工作单元,以表明这些更改独立于其他更改。

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

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

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

使用不同的更改跟踪策略

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


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