Doctrine 2 中的级联“刷新”是啥意思?

Posted

技术标签:

【中文标题】Doctrine 2 中的级联“刷新”是啥意思?【英文标题】:What cascade "refresh" means in Doctrine 2?Doctrine 2 中的级联“刷新”是什么意思? 【发布时间】:2016-01-20 10:44:54 【问题描述】:

Doctrine2 中的级联“刷新”是什么意思?是实体更新操作吗?

更新

现在看来,例如,如果更改类别名称,所有相关产品都将被获取和更新。但是,由于通常实体仅通过 id 关联,因此获取所有产品是没有意义的,因为子表中没有要更新的内容。 出于这个原因,我认为“刷新”类似于 mysql“ON UPDATE CASCADE”——如果父主键发生变化,子值也会发生变化以反映这一点。所以 Doctrine 的“刷新”操作仅在 ORM 级别是相同的。并且只有在我们更新父 ID 时才有意义,对吗?

【问题讨论】:

【参考方案1】:

您可以找到文档here,但作为总结,我将复制一些要点:

持久化、移除、分离、刷新和合并个体 实体会变得相当麻烦,尤其是当一个高度 涉及交织的对象图。因此,教义 2 提供了一个 通过级联这些传递持久性的机制 操作。每个与另一个实体或集合的关联 实体可以配置为自动级联某些 操作。默认情况下,没有操作级联。

存在以下级联选项:

persist :级联将操作持久化到关联实体。 remove :级联删除操作到关联实体。 merge :级联合并操作到关联实体。 detach :将分离操作级联到关联实体。 refresh :将刷新操作级联到关联实体。

复制所有部分是不必要的,因为每个人都可以打开链接,但是从这部分中可以清楚地看到级联的想法。 根据教义对关联做一些自动处理。refresh cascade 的情况下,当您在@oneToMany 关联上定义此级联时,当您在一侧执行refresh 时,您要求教义在多侧刷新collection。 假设我们在CategoryProduct 实体之间有one-to-many 关联。如果你为它定义这个级联,每次你在任何Category 上调用refresh 时,它的Products Collection 都会被刷新。

关于你的这部分问题:是实体更新操作吗?是的,在Refresh中是指从数据源获取集合和实体到内存中。

级联操作在内存中执行。这意味着收藏和 相关实体被提取到内存中,即使它们仍然存在 级联操作即将执行时标记为惰性。 然而,这种方法允许执行实体生命周期事件 对于这些操作中的每一个。

但是,在级联时将对象图拉入内存可能会导致 相当大的性能开销,尤其是在级联时 馆藏很大。确保权衡利弊 您定义的每个级联操作。

【讨论】:

感谢您的回答!但是您能否提供一个更具体的“刷新”用法示例?请检查我的答案更新。 看来这个问题更多的是关于 $entity->refresh() 操作是什么意思。

以上是关于Doctrine 2 中的级联“刷新”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不加载视图的情况下重新加载/刷新部分视图中的级联下拉列表

对于 N:M 关系,在 MongoDB 中推荐的级联删除等效项是啥?

删除性能的级联:删除一行其 1-Many 行的最快方法是啥?

在刷新之前保存瞬态实例,或者将属性的级联操作设置为使其自动保存的内容

在 Doctrine 2 中指定十进制字段类型时,比例和精度是啥意思?

SQL中的级联菱形删除