Doctrine MongoDB只删除引用onRemove

时间:2013-09-10 16:53:38

标签: mongodb doctrine-orm cascade doctrine-odm doctrine-mongodb

我在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,在删除BasePage之前将引用设置回NULL,但我希望我能避免这种手动混乱。

1 个答案:

答案 0 :(得分:4)

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

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

另一方面, 就像手动删除B对象时要清理的A对象中的所有B对引用一样。使用pre或postRemove侦听器是您的最佳选择,并且如果您已在A上索引引用,则应该是一个非常简单的多更新查询来设置对null的引用,它们曾引用该实例B被删除了。