2013-04-24 11 views
20

Mam następujący podmiotowi galeriiUsuń element z oneToMany relacji

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; 

    /* ... */ 
} 

Ten gallery jest związana z manyToOne stosunku do podmiotu PointOfInterest. Poniżej znajduje się deklaracja

Używam również formularza do aktualizacji jednostki PointOfInterest. Oto deklaracja formularza:

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

i deklaracja .

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 
              )) 
    ; 
} 

Kiedy edytować PoI mogę dodać zdjęcia do galerii bez problemu, ale nic nie mogę usunąć.

Próbowałem podłączyć do galerii PreUpdate, ale nigdy nie jest wywoływana. Wydrukowałem dane wyjściowe w jednostce removePhotos jednostki Gallery, a zdjęcia zostały usunięte z galerii. Podejrzewam, że Galeria nigdy nie będzie trwała.

Oto kod, kiedy utrwalam PoI po edycji.

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

Co to jest wyświetlany błąd? – Sybio

+0

Nie ma błędu. Po prostu nie wiem, jak edytować mój kod, aby zachowywał się tak, jak chcę. – tomahh

+0

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

Odpowiedz

59

Istnieje article in Symfony2 cookbook o obsłudze tego typu sytuacji. Ponieważ masz relację OneToMany, musisz usunąć powiązane obiekty ręcznie w kontrolerze.

Edytuj: Możesz też skorzystać z funkcji Doctrine's orphan removal.

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

Problem polega na tym, że Galeria nie może sama pracować. Używam go w wielu bytach i musiałem powtórzyć mój kod. Chciałbym znaleźć rozwiązanie DRY. – tomahh

+4

@TomAhh W tym przypadku nie widzę żadnego standardowego rozwiązania, chyba że możesz spróbować ustawić 'orphanRemoval = true' na skojarzeniu' $ photos'. A następnie wywołaj '$ photo-> setGallery (null)' wewnątrz metody 'removePhotos ($ photo)' galerii. – gatisl

+0

To idealne rozwiązanie, dzięki! Teraz działa dokładnie tak, jak ja też tego chcę. Czy mógłbyś zaktualizować swoją odpowiedź, aby ją zweryfikować? – tomahh