我在 ChartPage 和 BaseChart 之间有 OneToMany 关系:
1 ChartPage holds 1 BaseChart
和1 BaseChart holds many 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 将引用设置回NULL
删除 BasePage 之前,但我希望我可以避免这种手动混乱。