2016-07-14 3 views
1

Slowly Changing Dimension problem(要約:ユーザーがシステムから削除されても注文データを保持したい)を避けるため、deleteイベントをハイジャックした代わりにレコードにinvalidフラグを設定します。Doctrine:削除操作を無効にして、代わりにレコードを無効にする

  • 私はStofDoctrineExtensionsBundleからsoftdeletableフィルタを知っているが、これは子オブジェクトにカスケードされます場合、私はわかりませんよ。

  • が、これは一般的な/良い練習/アイデアであり、次のライフサイクルコールバックでこれを行う?:

/

/** 
* @ORM\PreRemove 
*/ 

public function makeInvalid() { 
    $this->enddate = new \DateTime(); // set the end of validity property to now 
    cascadeToRelatedObjects(); // i.e. make sure all 'child' objects also change validity 
    somehowContinueTheOperation(); // i.e. do not cause an Error of sorts 
} 
  • または私は、むしろ、機能を変更する必要がありますフォーム上の削除ボタンをクリックし、上記に該当する更新機能を割り当てますか?

答えて

0

実際には、softdeleteableDoctrineExtensionsから実行する方法です。所有するオブジェクトのプロパティ(一般的にはOneToManyを持つもの)で正しくcascade={"remove"}オプションを設定すると、それは正常にカスケードします。

私が間違っていると私を修正しますが、onDelete="CASCADE"を設定する必要はないと思われます。これは、データベースによって実行される機能であり、ソフト削除の必要性を知らないため、すべての子をソフト削除します。

私はこの拡張機能を取得するための最も簡単な方法は、以下に説明するように、あなたがそれを使用することができ、コマンドcomposer require StofDoctrineExtensionsBundleStofDoctrineExtensionsBundleをインストールし、config.ymlでそれを設定しました。 Deviceのインスタンスをソフト削除すると、その従属オブジェクトPartsもソフト削除されます。

それらを復元するには、おそらく関数などを書く必要があります。

use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* ... 
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false) 
*/ 

class Device { 
    /** 
    * @ORM\Column(name="deletedAt", type="datetime", nullable=true) 
    */ 
    private $deletedAt; 

    /** 
    * @ORM\OneToMany(targetEntity="Part", mappedBy="device", cascade={"persist","remove"}) 
    */ 
    private $parts; 
} 
関連する問題