Skip to content

Latest commit

 

History

History
119 lines (88 loc) · 2.71 KB

9.4-relations.md

File metadata and controls

119 lines (88 loc) · 2.71 KB

Relation

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!

One to One

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

Many to one + One to Many

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 à:

Many to Many

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é

Many to Many via une table de liaison

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[];
}