2011-01-21 9 views
0

私はDoctrine 2 Docs> Events> PreRemoveを読んでいました。その EntityManager#remove()メソッドに渡されたときDoctrine 2:すべてのエンティティでカスケードされたPreRemove

preRemoveイベントは、すべての エンティティに呼ばれています。 は、カスケード削除とマークされた であるすべてのアソシエーションに対してカスケードされています。

方法は removeメソッド自体はフラッシュ操作 中に呼び出された場合を除き、 preRemoveイベント内で呼び出すことができるものに制限はありません。

私は関連するエンティティに何が起こるかを処理しようとしています。

例えば、ユーザーは...プロジェクトで

  • 自身のプロジェクト
  • コラボレーション
  • 自身TodoLists
  • 自身トドストドス
  • を割り当てることが

だから私はすべてのこれらの関係を処理することができますは、preremove 。だから私は

/** 
* @PreRemove 
*/ 
protected function onPreRemove() { 
    foreach ($this->projects as $proj) { 
    $proj->collaborators->remove($this); 
    } 
    foreach ($this->ownedTodoLists as $todoList) { 
    $todoList->owner = $todoList->project->owner; 
    } 
    foreach ($this->ownedTodos as $todo) { 
    $todo->owner = $todo->todoList->owner; 
    } 
    foreach ($this->assignedTodos as $todo) { 
    $todo->assigned = $todo->todoList->owner; 
    } 
} 

のような何かをした。しかし、すべての関連付けがカスケード削除マークのために、この機能(preRemoveは)私の藤堂、todolistの、リンクはカスケード削除マークされている場合、この関数呼び出しはできません、呼び出された場合、私は考えています彼らのために?それはリソースを浪費し、さらにエラーを投げるでしょうか? $thisはTodoのようなエンティティを参照するでしょうか?どのようにこれらの関係を処理するための良い方法は何ですか?

エンティティのカスケードをマークしていないかもしれませんが、手動でカスケード削除するためにこれらの機能を使用しますか?

答えて

0

特別なロジックを扱う場合(提供されたスニペットのように)、これは@preRemoveイベントフックのかなり典型的な使用法であると思います。いずれの列にも内部カスケードは使用しません。

+0

私はカスケードをpreRemoveフックを使用して変換しようとしていますが、エンティティを削除するには問題があります。エンティティマネージャが必要ですか?しかし、私は、モデルがエンティティマネージャを参照するのは良い考えではないと読んでいますか? preRemoveを介してモデルで削除をカスケードする方法はありますか?またはサービスクラスを介して唯一の方法ですか –

+0

ああ、私はあなたが指摘しようとしているジレンマを参照してください。しかし、あなたがそれを必要としているとは思えません。[関連付けを削除する](http://www.doctrine-project.org/docs/orm/2.0/ja/reference/working-with-associations.html#removing) -associations)。そしてあなたの他の質問に答えて、EntityManagerでEntityManagerを使うことは決してありません。 – Cobby

関連する問題