Doctrine2 : Comprendre la suppression en cascade
Pour une maintenance transparente de la base de données, il est souvent nécessaire de supprimer automatiquement les enregistrements enfants lorsque l'enregistrement parent correspondant est supprimé . Doctrine2 prend en charge cette fonctionnalité via « On Supprimer Cascade », une fonctionnalité qui garantit que les enregistrements enfants sont supprimés lorsque leur parent l'est.
Exemples d'entités
Considérez les entités suivantes :
<code class="php">class Child { /** @ORM\ManyToOne(targetEntity="Father", cascade={"remove"}) */ private $father; } class Father { /** @ORM\Id @ORM\GeneratedValue */ private $id; }</code>
Le problème : cascade de base de données manquante
Alors que le code établit une relation entre l'enfant et le père avec une cascade de « suppression », la base de données n'a pas l'option « Sur suppression Contrainte Cascade".
Solution : Cascade au niveau de la base de données
Pour implémenter true On Delete Cascade, ajoutez onDelete="CASCADE" à la colonne de jointure de l'enfant :
<code class="php">/** @ORM\JoinColumn(name="father_id", referencedColumnName="id", onDelete="CASCADE") */</code>
Ceci précise que lorsqu'une ligne est supprimée de la table Père, toutes les lignes correspondantes de la table Enfant seront automatiquement supprimées.
Attention : Comprendre Cascades
Il est important de noter la distinction entre les cascades au niveau ORM et au niveau de la base de données. Les cascades au niveau ORM fonctionnent au sein de UnitOfWork de Doctrine et n'affectent pas la structure de la base de données, tandis que les cascades au niveau de la base de données créent des contraintes physiques dans la base de données. Dans l'exemple actuel, cascade={"remove"} est une cascade au niveau ORM qui déclenchera une suppression récursive dans UnitOfWork, mais cela n'entraînera pas le comportement souhaité de la base de données.
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!