首页 > 解决方案 > 不推荐使用参数调用 Doctrine clear()

问题描述

教义建议——

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

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

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

标签: symfonydoctrineentitymanager

解决方案


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

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

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

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

使用不同的更改跟踪策略

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


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


推荐阅读