Подтвердить что ты не робот

Удалить элемент из отношения oneToMany

У меня есть следующий объект Gallery

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;

    /* ... */
}

Этот gallery связан с отношением manyToOne к объекту PointOfInterest. Вот объявление

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

Я также использую Form для обновления объекта PointOfInterest. Вот объявление формы

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

и объявление 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
                                            ))
    ;
}

Когда я редактирую PoI, я могу без проблем добавлять фотографии в галерею, но ничего не могу удалить.

Я попытался подключиться к галерее PreUpdate, но ее никогда не вызывали. Я напечатал вывод в removePhotos методе объекта gallery, и фотографии удалены из галереи. Затем я подозреваю, что Галерея никогда не будет сохранена.

Вот код, когда я сохраняю PoI после редактирования.

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,
        ));
}
4b9b3361

Ответ 1

статья в кулинарной книге Symfony2 об управлении подобным типом ситуации. Поскольку у вас есть отношения OneToMany, вы должны вручную удалить связанные объекты в контроллере.

Edit: Или вы можете использовать функцию Doctrine forphphans remove.

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