Je veux vérifier ma compréhension des opérations en cascade sur les associations Doctrine. Pour les besoins de cette question, j'ai deux modèles: Customer
et Insuree
.
Si je définis plusieurs relations entre un Customer
et Insuree
et set cascade{"all"}
, Je comprends que cela va:
C'est la définition de l'association sur Customers
.
/**
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"})
* @ORM\JoinTable(name="customer_insuree",
* joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")}
* )
*/
protected $insurees;
Si je définis la relation inverse plusieurs à plusieurs entre un Insuree
et Customer
et à définir cascade{"all"}
, Je comprends que cela va:
C'est la définition de l'association sur Insurees
.
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"})
*/
protected $customers;
Si je définis ensuite la relation comme une cascade persistante, une fusion et une séparation - la suppression de l'assuré ne supprime pas tous les clients associés - elle supprime uniquement les associations entre l'assuré et ses clients?
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"})
*/
protected $customers;
persiste et supprime
Vous avez raison en ce qui concerne cascade={"persist"}
, Ce qui signifie que l'entité persistante A, Doctrine, conservera également toutes les entités B de la collection.
Vous avez également raison en ce qui concerne cascade={"remove"}
, Ce qui signifie que la suppression de l'entité A, Doctrine, supprimera également toutes les entités B de la collection.
Mais je doute que vous souhaitiez jamais utiliser cela sur une association ManyToMany, car lorsque vous supprimez l'entité A qui transfère cette opération à toutes les entités B, ces entités B peuvent être associées à d'autres entités A.
détachez et fusionnez
Vous êtes pas correct concernant cascade={"detach"}
Et cascade={"merge"}
:
Ajouter/supprimer des entités de la collection est quelque chose vous devez faire (dans votre code). Lisez à ce sujet ici .
Detach signifie que vous détachez une entité de EntityManager. EntityManager ne gérera plus cette entité. Cela rend une entité détachée identique à une entité nouvellement instanciée, à la différence qu’elle est déjà dans la base de données (mais vous en avez informé EntityManager).
En d'autres termes: cascade={"detach"}
Signifie que le détachement de l'entité A, Doctrine, détachera également toutes les entités B de la collection.
Fusionner est l'opposé de detach: Vous allez fusionner une entité détachée dans le gestionnaire EntityManager.
Notez que merge()
renverra en fait un objet géré nouveau, l’objet détaché que vous lui aurez transmis ne sera pas géré.