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;
    }
}
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;
    }
}
si on fait ç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();
ou ça :

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();
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 ?