35-2 Définir une relation
Il est maintenant temps de définir la relation entre une issue et un projet. Peut-être avez-vous remarqué au niveau précédent que nous n'avons pas ajouté de colonne dans la table issues pour faire référence au projet (ex.: projetId).
Ajouter un tableau issues à l'entité Projet
Ultimement, on veut être en mesure d'obtenir un tableau d'issues à partir d'un projet (ex.: projet.issues).
@Entity({ name: 'projets' })
export class Projet extends BaseEntity {
@ApiProperty({
description: "L'identifiant du projet",
example: 1,
})
@PrimaryGeneratedColumn()
id: number;
issues: Issue[];
//...
Ajouter une référence à un projet dans Issue
Ensuite, on veut pouvoir faire l'inverse, appeler issue.projet par exemple, et obtenir le projet associé à l'issue.
Pour cela, on peut ajouter une propriété projet sur l'entité Issue.
@Entity('issues')
export class Issue extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
projet: Projet;
//...
Définir les relations (OneToMany et ManyToOne)
OneToMany (projet -> issues)
Un projet est relié à plusieurs issues, c'est ce qu'on appelle une relation OneToMany (un à plusieurs -> UN projet a PLUSIEURS issues).
À l'aide de TypeORM, on peut définir cette relation de la façon suivante:
@Entity({ name: 'projets' })
export class Projet extends BaseEntity {
@ApiProperty({
description: "L'identifiant du projet",
example: 1,
})
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Issue, (issue) => issue.projet)
issues: Issue[];
@OneToManypermet de définir une relation de type One to Many. Le décorateur prend une fonction anonyme de deux paramètresIssuele type d'objet auquel est associée la relation (Issue dans le cas)(issue) => issue.projetune fonction qui définit la relation inverse. Pour obtenir un projet à partir d'une issue, dans ce cas-ci.
ManyToOne (issue -> projet)
À l'inverse, pour définir que plusieurs issues peuvent être associées à un même projet, on définit la relation comme étant de plusieurs à un, soit ManyToOne.
On spécifie aussi la colonne responsable de contenir la clé étrangère, soit projetId
Le standard pour Postgres/TypeORM afin de définir la clé étrangère est [tablesingulier][Colonne]
Comme ici on fait référence à la colonne id de la table projets, la colonne représentant la clé étrangère sera projetId.
@Entity('issues')
export class Issue extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
projet_id: number;
@ManyToOne(() => Projet, (projet) => projet.issues)
@JoinColumn({ name: 'projet_id' })
projet: Projet;
@JoinColumn vient préciser que la colonne permettant de faire la jointure entre les deux entitées est projet_id. Autrement, la valeur par défaut sera projetId.
Ce qui génère la requête SQL suivante:
ALTER TABLE "issues" ADD "projetId" integer NOT NULL
ALTER TABLE "issues" ADD CONSTRAINT "FK_055da7d0875a165ce97fcf93752" FOREIGN KEY ("projetId") REFERENCES "projets"("id") ON DELETE NO ACTION ON UPDATE NO ACTION