3

ChartPage と BaseChart の間に OneToMany 関係があります。

1 ChartPage holds 1 BaseChart1 BaseChart holds many ChartPages

チャートはアプリケーションの別のバンドルで管理されているため、個別に削除できます。私が望んでいるのは、Chart が削除されたときに、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;

}

私が残した唯一のアイデアは、BasePage が削除される前に参照を元に戻すカスタム preRemove EventListener を作成するNULLことですが、この手動の混乱を回避できることを願っていました。

4

1 に答える 1

4

Doctrine MongoDB ODM のカスケード機能は、一方向でのみ動作します。B への参照を持つオブジェクト A で何らかのライフサイクル イベントを実行すると、persist/remove/etc を B にカスケードすることができます。 1 対 1 または 1 対多の関係で。ODM マニュアルに記載されているとは思えませんが、ORM ドキュメントに記載されている機能と非常によく似ています。

あなたの場合、Aの削除時にカスケード機能は必要ありません。B をそのままにしておきます。

反対に、B オブジェクトを手動で削除するとき、A オブジェクト内の B へのすべての参照をクリーンアップする必要があります。nullこれには pre または postRemove リスナーを使用するのが最適なオプションです。A の参照にインデックスを付けている場合、削除された B のインスタンスをかつて参照していた場所に参照を設定するのは、非常に簡単なマルチ更新クエリである必要があります。 .

于 2013-10-21T21:16:47.317 に答える