0

J'ai deux entités: Spécialisation et Cours. Une spécialisation a beaucoup de cours, donc les relations sont "OneToMany" et "ManyToOne".Comment détacher une relation sans supprimer d'entité dans Sonata AdminBundle?

Je souhaite créer des spécialisations et des cours séparément, puis attacher de nombreux cours à la spécialisation par sélection multiple. Et j'ai aussi besoin de supprimer (détacher) les cours de la spécialisation mais sans supprimer les cours-entités. Alors, je l'ai fait de telle manière:

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

Mais lorsque je retire bien sûr lié de sélection sur le terrain dans -Page-édition de spécialisation, cours-objet la suppression de DB aussi. J'ai essayé de supprimer la propriété orphanRemoval de la relation, mais lorsque j'essaie de détacher des cours de la spécialisation, rien ne se passe. Donc, ma question est: Comment puis-je seulement détacher des entités-enfants de l'entité-mère dans SonataAdminBundle?

+0

Pouvez-vous s'il vous plaît poster votre définition d'entités, aussi un seul cours peut-il apparaître dans plusieurs spécialisations? –

Répondre

0

Je l'ai résolu!

J'ai décidé d'utiliser des hooks de sauvegarde (méthodes prePersist et preUpdate dans ma classe SpecialisationAdmin).

L'idée principale - de désactiver tous les cours connexes de la spécialisation et ensuite définir ceux qui viennent de la forme.

Mais si je supprime des cours de la spécialisation sur la page d'édition, je n'obtiendrais pas leurs objets dans l'objet de spécialisation dans la méthode preUpdate. Et si je ne reçois pas d'objets cours, je ne peux pas mettre leur spécialisation à NULL.

Ainsi, la solution de ce problème est d'utiliser la propriété de l'instantané pour obtenir tous les cours que la spécialisation avait avant de soumettre la forme et à établir leur spécialisation à NULL, puis définissez la spécialisation actuelle des cours qui sont venus de la forme:

/** 
    * @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); 
     } 
    }