Bug PersistentCollection::clear() et PersistentCollection::removeElement() avec orphanRemoval
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:
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;
}
} |
Code:
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;
}
} |
si on fait ça :
Code:
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(); |
ou ça :
Code:
1 2 3 4 5 6
| $user = $repositoryUser->find(1);
$comment = $user->getComments()->first();
$user->getComments()->clear();
$user->addComment($comment);
$manager->flush(); |
au final, l'entité Comment sera supprimée.
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 ?