Supprimer un élément de la relation oneToMany

J'ai l'entité de Galerie suivante

class Gallery
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var ArrayCollection
     * @ORMOneToMany(targetEntity="TessaGalleryBundleEntityPhoto", mappedBy="gallery", cascade={"persist", "remove"})
     */
    private $photos;

    /* ... */
}

Ce gallery est lié avec un manyToOne relation à un PointOfInterest entité. Voici la déclaration

class PointOfInterest
{
 /* ... */
 /**
 * @ORMManyToOne(targetEntity="TessaGalleryBundleEntityGallery", cascade={"persist", "remove"})
 * @ORMJoinColumn(nullable=false)
 */
private $gallery;
 /* ... */

J'utilise également un formulaire pour mettre à jour l'entité PointOfInterest. Voici le formulaire de déclaration

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

Et la déclaration GalleryType.

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

Lorsque je modifie le PoI, je peux ajouter des photos à la galerie sans problème, mais je ne peux rien supprimer.

J'ai essayé de brancher sur gallery PreUpdate, mais il n'est jamais appelé. Je sortie imprimée dans la méthode removePhotos de l'entité Gallery, et les photos sont supprimées de la galerie. Je soupçonne alors la galerie de ne jamais être persisté.

Voici le code quand je persiste le PoI après l'édition.

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,
        ));
}
24
demandé sur tomahh 2013-04-24 20:35:41

1 réponses

Il y a article dans Symfony2 cookbook sur la gestion de ce type de situation. Comme vous avez une relation OneToMany, vous devez supprimer manuellement les objets associés dans le contrôleur.

Modifier : Ou vous pouvez utiliser la fonctionnalité de suppression orpheline de Doctrine.

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);
    }
}
65
répondu gatisl 2017-09-19 07:21:06