Doctrine MongoDB仅在删除时删除引用
我在图表页和基础图表之间有一种单一的关系:Doctrine MongoDB仅在删除时删除引用,mongodb,doctrine-orm,cascade,doctrine-odm,doctrine-mongodb,Mongodb,Doctrine Orm,Cascade,Doctrine Odm,Doctrine Mongodb,我在图表页和基础图表之间有一种单一的关系: 1个图表页包含1个基本图表,1个基本图表包含多个图表页 图表在我的应用程序的另一个包中进行管理,因此它们可以单独删除。我喜欢的是,该原则在删除图表时自动删除图表页。图表引用,但除此之外没有任何内容(不删除图表页) 另一种方法是让一切保持原样:当我删除带有引用的基线图的图表页面时,不应该发生任何事情(不删除基线图) 我尝试了其中的每一种组合:cascade=“{detach,merge,refresh,remove,persist}”,我能想到,但我想不
1个图表页包含1个基本图表
,1个基本图表包含多个图表页
图表在我的应用程序的另一个包中进行管理,因此它们可以单独删除。我喜欢的是,该原则在删除图表时自动删除图表页。图表引用,但除此之外没有任何内容(不删除图表页)
另一种方法是让一切保持原样:当我删除带有引用的基线图的图表页面时,不应该发生任何事情(不删除基线图)
我尝试了其中的每一种组合: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;
}
我剩下的唯一想法是构建一个定制的preRemove EventListener,在删除BasePage ist之前将引用设置回NULL,但我希望能够避免这种手动混乱。Doctrine MongoDB ODM的级联功能只在一个方向上运行。如果在对象A上执行某个生命周期事件(对象A引用了B),我们可以将persist/remove/etc级联到B。ODM中有一个孤立删除的概念,它允许自动删除嵌入或引用在一对一或一对多关系中的对象。我不相信ODM手册中有记录,但它与功能的描述非常相似 在您的情况下,您不希望在删除时使用任何级联功能;你希望B保持原样
另一方面,您希望在手动删除B对象时清除A对象中对B的所有引用。使用pre或postRemove侦听器是最好的选择,如果您已经为a上的引用编制了索引,那么将引用设置为
null
,这应该是一个非常简单的多次更新查询,因为它们曾经引用了已删除的B实例。感谢您指出了删除的原因-我没有意识到这一点(由于缺少文件)-我会检查它。现在我已经实现了预删除侦听器并手动清除所有引用孤立删除选项仍然只适用于a到B方向,因此它似乎与您的情况无关。您希望在单独删除B对象时将a.B引用设置为null。孤立删除只会删除B对象如果删除了(A上的)引用(单个引用或从具有多个集合的中删除)。preRemove侦听器确实适合您的需要。
/**
* 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;
}