2017-09-11 66 views
0

我有兩個實體:專業化和課程。 一個專業有很多課程,所以關係是「OneToMany」和「ManyToOne」。在Sonata AdminBundle中如何分離關係而不刪除實體?

我想分別創建專業化和課程,然後通過多重選擇將許多課程附加到專業化。 而且我還需要從專業化課程中刪除(分離)課程,但不刪除課程實體。 所以,我做了這樣的方式:

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

但是,當我在專業化編輯頁隨機從選擇字段刪除相關的課程,課程對象從數據庫中刪除了。 我試圖從關係中刪除orphanRemoval屬性,但是當我嘗試從專業化分離課程時,沒有任何反應。

所以,我的問題是: 我如何才能實現從SonataAdminBundle中的父實體分離子實體?

+0

您可以請發佈您的實體定義,也可以在多個專業中出現單個課程嗎? –

回答

0

我解決了!

解決方案: 我決定使用save-hooks(我的SpecialisationAdmin類中的方法prePersist和preUpdate)。

主要思想 - 從專業化中取消所有相關課程,然後設置來自表單的相關課程。

但是,如果我從編輯頁面上的專業化中刪除任何課程,我不會在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); 
     } 
    } 
相關問題