2017-09-11 64 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); 
     } 
    } 
相关问题