Salut !
Si on a une entité User, qui a une oneToMany vers Comment, avec orphanRemoval (je met pas le mapping, pas très utile pour l'exemple, et je met pas toutes les méthodes, juste celles utiles à l'exemple) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class User { protected $comments; public function __construct() { $this->comments = new ArrayCollection(); } public function getComments(): Collection { return $this->comments; } public function addComment(Comment $comment): self { if ($this->comments->contains($comment) === false) { $this->comments->add($comment); $comment->setUser($this); } return $this; } }si on fait ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Comment { protected $user; public function setUser(?User $user): self { $this->user = $user; return $this; } public function getUser(): ?User { return $this->user; } }
ou ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $user = $repositoryUser->find(1); foreach ($user->getComments() as $comment) { $user->getComments()->removeElement($comment); $user->addComment($comment); } $manager->flush();
au final, l'entité Comment sera supprimée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $user = $repositoryUser->find(1); $comment = $user->getComments()->first(); $user->getComments()->clear(); $user->addComment($comment); $manager->flush();
Pourquoi ? Parceque dans PersistentCollection, il y a une gestion automatisée des orphanRemoval : un appel à clear() ou removeElement() ajoutera les entitées supprimées dans UnitOfWork::$orphanRemovals.
Un appel à flush() va lire UnitOfWork::$orphanRemovals, et supprimer toutes les entitées stockées, même si elles ont re nouveau été ajoutées dans la liaison.
Voir https://github.com/doctrine/doctrine...ction.php#L395 et https://github.com/doctrine/doctrine...ction.php#L560
Comment est-ce que vous faites / feriez pour contrer ce comportement ?
Partager