35-10 ON DELETE CASCADE
Un enjeu que vous aurez si vous tentez de supprimer un projet qui possède des issues est que les issues sont dépendantes du projet (contrainte de clé étrangère FK).
Par exemple, dans mon cas, si j'essaie de supprimer le projet avec le id 4 qui existe dans ma BD locale et est associé à des issues, l'erreur suivante survient:
query: DELETE FROM "projets" WHERE "id" = $1 -- PARAMETERS: [4]
query failed: DELETE FROM "projets" WHERE "id" = $1 -- PARAMETERS: [4]
error: error: update or delete on table "projets" violates foreign key constraint "FK_055da7d0875a165ce97fcf93752" on table "issues"
query: ROLLBACK
[Nest] 23890 - 11/03/2023, 10:36:00 AM ERROR [ExceptionsHandler] update or delete on table "projets" violates foreign key constraint "FK_055da7d0875a165ce97fcf93752" on table "issues"
Pour définir que les issues devraient être supprimées par la même occasion, il faut définir le comportement ON DELETE de la clé étrangère (Projet).
Dans l'entité Issue, lorsque le lien avec le projet est défini, on peut préciser que lorsque ce dernier est supprimé, les issues associées doivent aussi être supprimées.
export class Issue extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
projetId: number;
@ManyToOne(() => Projet, (projet) => projet.issues, { onDelete: 'CASCADE' })
projet: Projet;
L'ajout de l'option onDelete: 'CASCADE ajoutera l'option SQL ON DELETE CASCADE à la définition de la clé étrangère:
query: ALTER TABLE "issues" ADD CONSTRAINT "FK_055da7d0875a165ce97fcf93752" FOREIGN KEY ("projetId") REFERENCES "projets"("id") ON DELETE CASCADE ON UPDATE NO ACTION
Maintenant, si vous supprimez le projet, les issues associées seront par la même occasion supprimées.
