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