web-dev-qa-db-fra.com

Comprendre Doctrine Opérations en cascade

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:

  • L'ajout d'un nouvel assuré à un client persistera et assurera la création d'une association dans la table de jointure.
  • Le retrait d'un assuré de la collection détache l'assuré du client et le détache de l'assuré.
  • La suppression du client supprimera tous les assurés associés au client.

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:

  • L'ajout d'un nouveau client à un assuré persistera et créera une association dans la table de jointure.
  • Retirer un client de la collection le détachera de l'assuré et le détachera du client.
  • La suppression de l'assuré supprimera tous les clients qui lui sont associés.

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;
61
user2406944

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é.

137
Jasper N. Brouwer