2011-10-14 3 views
10

Bonjour J'ai un problème en essayant de supprimer en cascade des entités dans les relations OneToMany. Après quelques heures de débogage, j'ai essayé de rétrograder la doctrine de la dernière version 2.1.2 à la version 2.0.2 et elle a soudainement commencé à fonctionner.Doctrine 2.0 vs 2.1 cascade remove OneToMany

Imagin deux entités Société et adresse en relation 1: N. Lorsque j'essaie de supprimer l'entité Société, je souhaite que les adresses attribuées soient également supprimées.

$em->remove($company); 
$em->flush(); 

Dans la doctrine 2.1.2, la suppression des adresses n'est pas effectuée, de sorte que la contrainte d'intégrité échoue. Dans la version 2.0.2, cela fonctionne parfaitement. Wierd chose sur elle est, si j'utilise EntityAudit extension https://github.com/simplethings/EntityAudit le LogRevisionListener corrige les versions des entités d'adresses (les mettre revtype = DEL) dans la doctrine 2.1.2 (bien sûr en 2.0.2 aussi bien) mais l'UnitOfWork ne le supprime pas.

Y a-t-il une différence dans la façon de gérer le retrait en cascade dans la version 2.0.2 et 2.1.2?

Merci beaucoup

+0

Je suis tombé sur ce problème aujourd'hui aussi, j'utilise 2.1.6. :/ – mokagio

+0

Eh bien, je dois me corriger, ça marche pour moi maintenant! J'utilisais 'cascade = {" all "}' mais quand je l'ai changé dans 'cascade = {" remove "}' tout a commencé à fonctionner correctement. – mokagio

+0

Bien que je doive dire que mon problème n'est peut-être pas entièrement dû à l'ensemble d'annotations ou à Doctrine, parce que je fais une manipulation intensive sur les entités et, après un test sur la combinaison des options en cascade, j'ai découvert que L'option '' fusionner ''était celle qui donnait des problèmes. J'espère que ça aide de toute façon :) – mokagio

Répondre

1

J'ai rencontré le même problème et je l'ai résolu avec ce code:

$em->remove($object); 
$em->flush(); 
$em->remove($user); 
$em->flush(); 

Peut-être que vous pouvez utiliser un findAll sur votre company pour les adresses et supprimer ce avec un foreach comme ça:

// Return all the addresses of the company 
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company); 
$em->remove($company); 
foreach ($address in $addresses) 
{ 
    $em->remove($address); 
} 

ce n'est pas une très bonne méthode, mais pour l'instant, c'est tout ce que je a trouvé.

+1

Je l'ai résolu en déclassant la doctrine :) merci, mais ce n'est pas la méthode que je cherche :(ce pourrait être probablement un bug (ou une fonctionnalité?) – stefi

10

Essayez d'utiliser ceci sur l'attribut addresses de votre Company classe

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true) 
+1

Je suis en utilisant la doctrine 2.2.3 et toujours la même chose J'ai dû ajouter orphelinEntrée = vrai Un peu étrange parce que je ne supprime pas un côté pour ne pas créer d'orphelins Peut-être parce que le côté le plus est le côté propriétaire et que je retire d'un côté .Les mises à jour fonctionnent parce que le côté plusieurs est le côté propriétaire et que j'utilise à la fois '$ this-> addSomething (theThing)' et 'theThing-> setSomething ($ this)' où comme si je supprimais theThing il n'y a pas de réglage , seulement '$ this-> removeSomething (theThing)' – HMR

3

J'ai eu le même problème ... Les relations ont été ajoutées ou mises à jour, mais pas supprimé, même si j'avais cascade: [persistent , retirer].

J'ai découvert que je n'avais pas besoin de l'attribut "remove" dans "cascade", mais je devais ajouter le paramètre "orphelinRemoval": true. Je devenais fou, vous avez fait ma journée!