Voila generalement on recupere notre entite avec le service Manager pour pouvoir apres la supprimer

$entity = $this->getDoctrine()->getRepository('Bundle:entity')->find(id);
$manager->remove($entity);
$manager->flush();

Moi je cherche a supprimer une entite que je possede deja c'est a dir sans avoir a la recuperer avec la repository
J'envoie l'objet $entity ( qui a etais recuperer depuis la bdd ulterieurement et donc possede bien un id) a une function qui s'occupe de le supprimer

public function removeEntity($entity){
$manager = $this->getDoctrine()->getManager();
$manager->remove($entity);
$manager->flush();
}

Lorsque j'essaye je une erreur : A detached entity was found during removed
alors je rajoute un persist avant le remove
l'appli marche mais elle supprime pas mon entity de la bdd
Voila je cherche un moyen de supprimer une entity sans avoir a la recuperer par le repository et de preference sans avoir a cree ma propre methode dans le repository
Merci d'avance

5 réponses


nico41
Réponse acceptée

bonjour,

public function removeEntity($entity){
$manager = $this->getDoctrine()->getManager();
$entity = $manager->merge($entity);       //   <= ajoute cette ligne
$manager->remove($entity);
$manager->flush();
}
/**
 * @Route("/pro/{id}/supprimerProduit",name="supprimerProduit")  
* @Template()
*/
public function supprimerProduitAction(Produit $produit)
{
$em=$this->getDoctrine()->getManager();
$em->remove($produit);
$em->flush();
}

@nico41: Bonjour et Merci à toi enfaite j'ai déjà essayer ca et a ça n'a pas marcher je viens de le ressayer aujourd’hui hui et sa marche, t'est ptet un porte-bonheur x) bref merci pour ta réponse et pour la chance que tu viens de m'apporter ^^
Sinon tu peux m'expliquer ques-qu’elle fait exactement cette fonction merge

cette fonction réintegre ton entité dans les entités que ton manager doit surveiller.

un exemple :
dans un controller on recupere une entité de façon normal ( avec find($id) )
puis on passe cette entité vers un autre controller dans une variable de session
ce qui fait que dans le controller d'arrivé, ton manager $em n'a pas connaissance de cette entité, il n'en a aucune référence car ce n'est pas lui qui l'a recherché en bdd.
il faut lui dire alors quelle existe et qu'il doit la réintegrer => la 'merger' dans son 'tableau' des entités à surveiller

l'entityManager possede un objet UnitOfWork, uow
uow enregistre les entités dans des tables en fonction de leur état : nouvelle entité, à mettre à jour, à supprimer... etc ...
ton entité ne sera référencée dans aucune de ces tables. Il faut 'merger' dedans. Je connais pas la mécanique exacte mais on peut penser que ton entité sera mergée dans la table 'à mettre à jour', et quand tu fais $em->remove($entity), ton entité passe dans la table des entités à supprimer. Et quand tu flush les requetes sont envoyées à la bdd.

@nico41: C'est effectivement le problème qui c'est pose cher moi je voulais faire passer une entité a un autre controller
Et j'ai essayé de régler le problème avec un persist pour que le manager le prend en considération et comme l'objet a bien une valeur dans son attribut id je pensais qu'il aller comprendre tous seul que l'entité existe déjà
Bref encore une fois merci bcp pour tes réponses ;)
@samir_822002 : dsl j'avais pas vu ton msg donc merci a toi aussi