Коллекция форм Symfony2: Как удалить сущность из коллекции? - PullRequest
4 голосов
/ 19 января 2012

Я пытаюсь удалить объекты из коллекции, но это не работает.

Я думаю, что где-то произошла ошибка, но я не знаю, где.

Вот код от моего updateAction:

    $em = $this->getDoctrine()->getEntityManager();

    $entity = new Person();

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Person entity.');
    }

    $editForm   = $this->createForm(new PersonType(), $entity);
    $deleteForm = $this->createDeleteForm($id);

    $request = $this->getRequest();

    $editForm->bindRequest($request);

    if ($editForm->isValid()) {
        $entity = $editForm->getData();

        $em->persist($entity);
        foreach($entity->getAddresses() as $address)
        {               
            $em->persist($address);
        }
        $em->flush();                                 

        return $this->redirect($this->generateUrl('person_show', array('id' => $id)));
    }

    return $this->render('AppPersonBundle:Person:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),

    );

Обратите внимание, что для удаления моей сущности я удаляю div из html.

Я имею в виду, например, удалить <div id="myapp_personbundle_persontype_address_4">.

Это правильный путь?

Ответы [ 4 ]

15 голосов
/ 18 января 2015

Благодаря этому ответу я нашел лучшее решение. Вы можете использовать удаление доктрины сиротами функция:

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);
    }
}
3 голосов
/ 19 января 2012

Сейчас я делаю:

    [...]        
    $editForm   = $this->createForm(new PersonType(), $entity);
    $deleteForm = $this->createDeleteForm($id);

    $previousCollections = array(
        'addresses' => $entity->getAddresses(),
    );        

    $request = $this->getRequest();
    $editForm->bindRequest($request);

    if ($editForm->isValid()) {
        $entity = $editForm->getData();

        $this->deleteCollections($em, $previousCollections, $entity);

        $em->persist($entity);
        foreach($entity->getAddresses() as $address)
        {               
            $em->persist($address);
        }
        $em->flush();                                 

        return $this->redirect($this->generateUrl('person_show', array('id' => $id)));
    }
    [...]
}

private function deleteCollections($em, $init, $final)
{
    if (empty($init)) {
        return;
    }

    if (!$final->getAddresses() instanceof \Doctrine\ORM\PersistentCollection) {
        foreach ($init['addresses'] as $addr) {
            $em->remove($addr);
        }
    }
}

И я надеюсь, что однажды решение будет найдено с https://github.com/symfony/symfony/issues/1540,, но оно будет найдено медленно.

1 голос
/ 14 августа 2013

Форма коллекции в Symfony2 довольно проста, она делает почти всю работу за вас.В основном вам просто нужно добавить collection type и установить флаги allow_add, allow_delete и добавить небольшой код JavaScript.Взгляните на пример поваренной книги

0 голосов
/ 11 декабря 2015

Я использую это решение ...

В контроллере:

$em = $this->getDoctrine()->getManager();
$enity->removeElements($em);

//Add all your elements again in order to update entity collection.
$entity->addElement($element) ...
....
$em->persist($entity);
$em->flush();

В субъекте:

public function removeElements($em)
{
    $elements = $this->elements;

    foreach ($elements as $element) {
        $this->elements->removeElement($element);
        $em->remove($element);
        $em->persist($this);
    }

}

Для меня это работает и показывает меньше кода, и мне не нужно использовать функцию orphanRemoval.

...