Maison  >  Article  >  développement back-end  >  Comment Doctrine2 gère-t-il le comportement en cascade avec ON DELETE CASCADE ?

Comment Doctrine2 gère-t-il le comportement en cascade avec ON DELETE CASCADE ?

DDD
DDDoriginal
2024-11-02 08:28:02758parcourir

How Does Doctrine2 Handle Cascade Behavior with ON DELETE CASCADE?

Comprendre la suppression de la cascade avec Doctrine2

Doctrine2 offre la flexibilité nécessaire pour configurer le comportement en cascade lorsque vous travaillez avec des entités associées. Cependant, une idée fausse courante est que la définition de cascade={"remove"} dans l'association d'entité ajoutera automatiquement l'option ON DELETE CASCADE à la colonne de clé étrangère dans la base de données.

Dans Doctrine2, il existe deux types distincts. de cascades :

1. Cascade au niveau ORM :

  • Utilise cascade={"remove"} dans l'association d'entités.
  • Un calcul effectué par l'unité de travail (UoW).
  • Itère sur les objets associés et les supprime lorsque l'objet parent est supprimé.

2. Cascade au niveau de la base de données :

  • Utilise onDelete="CASCADE" sur la colonne de jointure dans l'association d'entité.
  • Crée l'option ON DELETE CASCADE sur la colonne de clé étrangère dans la base de données.

L'exemple fourni dans la question utilise la cascade au niveau ORM. Bien qu'il supprime correctement les objets enfants associés lors de la suppression du parent, il ne crée pas l'option ON DELETE CASCADE dans la base de données. Pour y parvenir, la modification suivante est requise :

<code class="php">/**
 * @ORM\ManyToOne(targetEntity="Father", cascade={"remove"})
 *
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="father_id", referencedColumnName="id", onDelete="CASCADE")
 * })
 *
 * @var Father
 */
private $father;</code>

Il est important de noter que l'utilisation de la cascade au niveau ORM comme dans l'exemple entraînera la suppression de l'objet parent lorsqu'un objet enfant est supprimé. Ce n'est probablement pas le comportement prévu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn