Les relations permettent de créer des liens entre nos entités. Cela se matérialise dans le RDBMS par la création de clés étrangères entre les tables. Et l'utilisation de jointure par l'orm lors de la récupération des entités. Pas d'inquiétude, les jointures sont faites implicitement par TypeORM!
Les relations one to one permettent de lier exactement deux entités entre elles.
import { Entity, Column, OneToOne, PrimaryGeneratedColumn } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn("uuid")
uuid: string;
@OneToOne(() => Inventory, (inventory) => inventory.user, {
cascade: true,
eager: true, // charge automatiquement la jointure
})
inventory: Inventory;
}
@Entity()
export class Inventory {
@PrimaryGeneratedColumn("uuid")
uuid: string;
@OneToOne(() => User, (user) => user.inventory)
user: User;
}
Les relations one-to-many et many-to-one permettent de lier une entité vers plusieurs entités. Par exemple une recette à plusieurs ingrédients.
import {
Entity,
Column,
PrimaryGeneratedColumn,
OneToMany,
ManyToOne,
} from "typeorm";
@Entity()
export class Recipe {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Ingredient, (ingredient) => ingredient.recipe)
ingredients: Ingredient[];
}
@Entity()
export class Ingredient {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(() => Recipe, (recipe) => recipe.ingredients)
recipe: Recipe;
}
les tables créer ressembleront à:
Les relations many-to-many permettent de lier des entités entre elles.
Pour continuer sur notre exemple des recettes et des ingrédients, dans la réalité, un ingrédients peut être présent dans plusieurs recettes. Un lien many-to-many nous permettra de réutiliser une ingréidients dans plusieurs recettes.
Les ingrédients auront un tableau de recettes ce qui nous permettra de savoir dans quelles recettes un ingrédient est présent.
// TODO: many to many sans table déclaré
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
@Entity()
export class Recipe {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Quantity, (qt) => qt.recipe)
quantities: Quantity[];
}
@Entity()
export class Quantity {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(() => Recipe, (recipe) => recipe.quantities)
recipe: Recipe;
@ManyToOne(() => Ingredient, (ingredient) => ingredient.quantities)
ingredient: Ingredient;
quantity: number;
}
@Entity()
export class Ingredient {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Quantity, (qt) => qt.recipe)
quantities: Quantity[];
}