3

我在 ChartPage 和 BaseChart 之间有 OneToMany 关系:

1 ChartPage holds 1 BaseChart1 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 之前,但我希望我可以避免这种手动混乱。

4

1 回答 1

4

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

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

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

于 2013-10-21T21:16:47.317 回答