2017-09-11 10 views
0

私は2つのエンティティを持っています:スペシャライゼーションとコース。 1つの専門分野には多くのコースがあるため、リレーションは「OneToMany」と「ManyToOne」です。Sonata AdminBundleでエンティティを削除せずに関係を切り離す方法は?

私は専門とコースを別々に作成し、次に複数の選択を通して専門化に多くのコースを取り付けることができます。 また、専門分野からコースを削除(デタッチ)する必要がありますが、コース実体を削除する必要はありません。 だから、私はそれを、このような方法でした:

->add('courses', 'sonata_type_model', [ 
         'multiple' => true, 
         'property' => 'title', 
        ]) 

をしかし、私は専門-編集-pageに選択フィールドから関連のコースを削除すると、もちろん、オブジェクトがあまりにもDBから削除します。 私はrelationからorphanRemovalプロパティを削除しようとしましたが、特殊化からコースを切り離そうとすると何も起こりません。

私の質問は次のとおりです。 SonataAdminBundleの親エンティティから子エンティティを切り離すことはできますか?

+0

エンティティ定義を投稿してください。また、1つのコースを複数のスペシャライゼーションに掲載することはできますか? –

答えて

0

私はそれを解決しました!

解決策: セーブフック(私のSpecialisationAdminクラスでprePersistとpreUpdateメソッド)を使用することにしました。

主なアイデア - 専門分野から関連するすべてのコースを設定解除し、フォームから来たものを設定することです。

私はedit-pageの専門分野からコースを削除しても、preUpdateメソッドの特殊化オブジェクトではそのオブジェクトを取得できません。 コースオブジェクトを取得できない場合、専門化をNULLに設定することはできません。

ので、この問題の解決策は、専門のフォームを送信する前に持っていたとNULLに自分の専門を設定することを、すべてのコースを取得するには、スナップショットのプロパティを使用して、フォームから来たコースに、現在の特殊化を設定することです:

/** 
    * @param Specialisation $specialisation 
    */ 
    public function prePersist($specialisation) 
    { 
     $this->preUpdate($specialisation); 
    } 

    /** 
    * @param Specialisation $specialisation 
    */ 
    public function preUpdate($specialisation) 
    { 
     if (isset($specialisation->getCourses()->snapshot)) { 
      foreach ($specialisation->getCourses()->getSnapshot() as $course) { 
       $course->setSpecialisation(null); 
      } 
     } 
     foreach ($specialisation->getCourses() as $course) { 
      $course->setSpecialisation($specialisation); 
     } 
    } 
関連する問題