2013-04-24 11 views
20

Ich habe die folgende Galerie Einheitein Element Löschen von OneToMany Beziehung

class Gallery 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var ArrayCollection 
    * @ORM\OneToMany(targetEntity="Tessa\GalleryBundle\Entity\Photo", mappedBy="gallery", cascade={"persist", "remove"}) 
    */ 
    private $photos; 

    /* ... */ 
} 

Diese gallery mit einer manyToOne Beziehung zu einer PointOfInterest Einheit verbunden ist. Hier ist die Erklärung

class PointOfInterest 
{ 
/* ... */ 
/** 
* @ORM\ManyToOne(targetEntity="Tessa\GalleryBundle\Entity\Gallery", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(nullable=false) 
*/ 
private $gallery; 
/* ... */ 

ich auch ein Formular verwenden, um die PointOfInterest Entität zu aktualisieren. Hier ist die Form Erklärung

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
      ->add('name',   'text') 
      ->add('gallery',  new GalleryType()) 
     ; 
} 

und die GalleryType Erklärung.

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('photos', 'collection', array('type'   => new PhotoType(), 
              'required'  => false, 
              'allow_add'  => true, 
              'allow_delete' => true, 
              'by_reference' => false 
              )) 
    ; 
} 

Wenn ich die PoI bearbeite ich Fotos in die Galerie problemlos hinzufügen können, aber ich kann nichts löschen.

Ich habe versucht, Galerie PreUpdate Haken, aber es wird nie aufgerufen. Ich druckte die Ausgabe in removePhotos Methode Gallery Einheit, und die Fotos werden aus der Galerie entfernt. Ich vermute dann, dass die Galerie niemals persistiert wird.

Hier ist der Code, wenn ich nach der Bearbeitung die PoI beibehalten.

private function handleForm($elem, $is_new) 
{ 
    $form = $this->createForm(new CircuitType, $elem); 

    $request = $this->get('request'); 
    if ($request->getMethod() == 'POST') { 
     $form->bind($request); 

     if ($form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($elem); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('tessa_circuit_index')); 
     } 
    } 

    return $this->render('TessaUserBundle:Circuits:add.'.'html'.'.twig', 
     array(
      'form' => $form->createView(), 
      'is_new' => $is_new, 
     )); 
} 
+0

Was ist der angezeigte Fehler? – Sybio

+0

Es gibt keinen Fehler. Ich weiß einfach nicht, wie ich meinen Code bearbeiten soll, damit sich das so verhält, wie ich es möchte. – tomahh

+0

Duplizieren: http://stackoverflow.com/questions/8923919/symfony2-form-collection-how-to-remove-entity-from-a-collection –

Antwort

59

Es gibt article in Symfony2 cookbook zum Umgang mit dieser Art von Situation. Wenn Sie eine OneToMany-Beziehung haben, müssen Sie verwandte Objekte manuell im Controller entfernen.

Bearbeiten: Oder Sie können Doctrine's orphan removal Funktion nutzen.

class Gallery 
{ 
    //...  

    /** 
    * @ORM\OneToMany(targetEntity="Photo", mappedBy="gallery", cascade={"persist", "remove"}, orphanRemoval=true) 
    */ 
    private $photos; 

    //... 

    public function removePhotos($photo) 
    { 
     $this->photos->remove($photo); 
     $photo->setGallery(null); 
    } 
} 
+0

Das Problem hier ist, dass Gallery nicht in der Lage sein wird, selbst zu arbeiten. Ich verwende es in mehreren Entitäten und müsste meinen Code kopieren. Ich würde gerne eine DRY-Lösung finden. – tomahh

+4

@TomAhh In diesem Fall sehe ich keine Standardlösung, außer vielleicht können Sie versuchen, 'orphanRemoval = true' für' $ photos' zu setzen. Und dann rufen Sie '$ photo-> setGallery (null)' in 'removePhotos ($ photo)' Methode der Galerie. – gatisl

+0

Das ist eine perfekte Lösung, danke! Es funktioniert jetzt genau so, wie ich es möchte. Könnten Sie Ihre Antwort aktualisieren, damit ich sie bestätigen kann? – tomahh

Verwandte Themen