symfony - 不推荐使用参数调用 Doctrine clear()
问题描述
教义建议——
自学说/持久性 1.3 以来,不推荐使用任何参数调用 Doctrine\ORM\EntityManager::clear() 来清除特定实体,并将在 2.0 中删除。
我们在 Symfony 代码库中有很多参考资料,->clear(SpecificEntity::class)
并且正在寻求更新这些参考资料,但我们正在努力在最新的升级指南中找到建议的替代品。
是否有推荐的替代方法来清除最新版本的 Doctrine 中的特定实体?
解决方案
调用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
推荐阅读
- c# - 高速处理列表的多个计时器导致问题
- django - 在给定主键的情况下添加到多对多关系
- terminal - 在终端上管道重复输出
- sql - 同时选择 Distinct 和 sequence
- python - 地图功能花费太多时间(Pandas DataFrame)
- mysql - Laravel - 带有子查询的查询构建器
- c# - 如何在 C# 类对象中序列化这种类型的 json 字符串?
- r - 带有误差线的线图,其中每条线是一个不同的组,多个变量位于 x 轴上
- c# - 使用 Dapper、Azure SQL 和 .NET Core 3.1 的 Azure Web 应用程序的性能问题
- javascript - 如何从具有多个页面的单个 URL 的网站的特定页面中抓取信息?