Aller au contenu principal

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

src/projets/entities/projet.entity.ts
@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.

src/issues/entities/issue.entity.ts
@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[];
info
  • @OneToMany permet de définir une relation de type One to Many. Le décorateur prend une fonction anonyme de deux paramètres
  • Issue le type d'objet auquel est associée la relation (Issue dans le cas)
  • (issue) => issue.projet une 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

info

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;
info

@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