gpt4 book ai didi

mongodb - Doctrine MongoDB delete 仅引用 onRemove

转载 作者:可可西里 更新时间:2023-11-01 09:31:42 26 4
gpt4 key购买 nike

我在 ChartPage 和 BaseChart 之间有一对多关系:

1 个 ChartPage 包含 1 个 BaseChart 并且 1 个 BaseChart 包含多个 ChartPages

图表在我的应用程序的不同包中进行管理,因此可以单独删除它们。我喜欢的是,当图表被删除时,Doctrine 会自动删除 ChartPage.Chart 引用,但没有别的(删除 ChartPage)。

另一种方法应该让一切保持原样:当我删除带有引用 BaseChart 的 ChartPage 时 - 什么都不会发生(删除 BaseChart)

我尝试了其中一个的所有组合:cascade="{detach,merge,refresh,remove,persist}" 我能想到,但我想不出来..

这是我的映射:

<?php
/**
* Class ChartPage
* @package VBCMS\Bundle\AdminBundle\Document\Page
* @Serializer\AccessType("public_method")
* @MongoDB\Document()
*/
class ChartPage extends BasePage {

/**
* @var BaseChart
* @Serializer\Type("VBCMS\Bundle\StatisticBundle\Document\BaseChart")
* @Serializer\Accessor(setter="setChartDeserialize")
* @MongoDB\ReferenceOne(
* targetDocument="VBCMS\Bundle\StatisticBundle\Document\BaseChart",
* mappedBy="pages",
* cascade={"persist,detach,merge"}
* )
*/
protected $chart;

}

/

/**
* Class BaseChart
* @package VBCMS\Bundle\StatisticBundle\Document
* @Serializer\AccessType("public_method")
* @MongoDB\Document(
* collection="Chart",
* repositoryClass="VBCMS\Bundle\StatisticBundle\Repository\ChartRepository"
* )
*/
class BaseChart {

/**
* @var BasePage[]|Collection
* @Serializer\Exclude()
* @MongoDB\ReferenceMany(
* targetDocument="VBCMS\Bundle\AdminBundle\Document\Page\ChartPage",
* inversedBy="chart",
* cascade={"persist,detach,merge"}
* )
*/
protected $pages;

}

我剩下的唯一想法是构建一个自定义的 preRemove EventListener,在删除 BasePage 之前将引用设置回 NULL,但我希望我可以避免这种手动困惑。

最佳答案

Doctrine MongoDB ODM 的级联功能仅在一个方向上运行。如果您在引用 B 的对象 A 上执行一些生命周期事件,我们可以将持久化/删除/等级联到 B。ODM 中有一个孤立删除的概念,它允许自动删除嵌入或引用的对象在一对一或一对多的关系中。我不相信它在 ODM 手册中有记录,但它与 ORM documentation 中描述的内容非常相似。对于功能。

在您的情况下,您不希望在删除 A 时有任何级联功能;您希望 B 保持原样。

另一方面,当您手动删除 B 对象时,您希望清除 A 对象中对 B 的所有引用。使用 pre 或 postRemove 监听器是您最好的选择,并且如果您已经为 A 上的引用编制索引,那么将引用设置为 null 应该是一个非常简单的多次更新查询,它们曾经引用过到被删除的 B 的实例。

关于mongodb - Doctrine MongoDB delete 仅引用 onRemove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18724762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com