【问题标题】:Calling Doctrine clear() with an argument is deprecated不推荐使用参数调用 Doctrine clear()
【发布时间】:2020-01-29 15:20:57
【问题描述】:

教义建议 -

使用任何参数调用 Doctrine\ORM\EntityManager::clear() 自学说/持久性 1.3 以来,明确的特定实体已被弃用,并将在 2.0 中删除。

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

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

【问题讨论】:

    标签: symfony doctrine entitymanager


    【解决方案1】:

    调用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2012-11-14
      • 2020-08-02
      • 2020-04-28
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多