web-dev-qa-db-fra.com

symfony2 Doctrine supprime un tableau d'objets

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.

13
Davit

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();
25
Markus Kottländer

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.

3
COil

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();
}
0
wIRELESS