Je souhaite supprimer tous les enregistrements de la base de données correspondant à un ID utilisateur particulier dans Symfony2.
$em = $this->getDoctrine()->getManager();
$user_service = $em->getRepository('ProjectTestBundle:UserService')
->findByUser($this->getUser()->getId());
Cela peut retourner quelques objets correspondants, alors quand je lance:
$em->remove($user_service);
$em->flush();
une erreur se produit:
EntityManager#remove() expects parameter 1 to be an entity object, array given.
Comment puis-je supprimer tous les enregistrements (objets) correspondant à une condition particulière? Btw, lorsque je lance une instruction SQL équivalente dans mysql, cela fonctionne parfaitement.
Pourquoi ne vous contentez-vous pas de parcourir le tableau d'objets?
$user_services = $em->getRepository('ProjectTestBundle:UserService')
->findByUser($this->getUser()->getId());
foreach ($user_services as $user_service) {
$em->remove($user_service);
}
$em->flush();
Vous pouvez également utiliser quelque chose comme ceci:
$user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId());
array_walk($user_services, array($this, 'deleteEntity'), $em);
$em->flush();
Ajoutez ensuite cette méthode à votre contrôleur:
protected function deleteEntity($entity, $key, $em)
{
$em->remove(entity);
}
Ou simplement utiliser:
$user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId());
$this->deleteEntities($em, $user_services);
$em->flush();
...
protected function deleteEntities($em, $entities)
{
foreach ($entities as $entity) {
$em->remove($entity);
}
}
Notez qu'en utilisant Propel
et la PropelBundle
, la PropelObjectCollection
implémente une fonction delete()
afin que vous n'ayez pas à faire cette boucle à la main.
Vous pouvez également utiliser la méthode delete
du constructeur de requêtes de doctrine.
public function deleteAllByUser(UserInterface $user)
{
$query = $this->createQueryBuilder('related_entity')
->delete()
->andWhere('related_entity.user = :user')
->setParameter('user', $user)
->getQuery();
return $query->execute();
}