Aller au contenu principal

Relations

Clés étrangères​

Une clé étrangère se déclare sur la colonne avec @ColumnOption.References(colonne), complété par @ReferenceOption :

import {Column, ColumnOption, Join, QueryRow, ReferenceOption, Table} from '@fca.gg/orm';
import {User} from './User';

@Table('posts')
export class Post extends QueryRow {
@Column.Increment()
@ColumnOption.Primary()
private id!: number;

@Column.Integer()
@ColumnOption.NotNullable()
@ColumnOption.Unsigned()
@ColumnOption.References('id')
@ReferenceOption.InTable('users')
@ReferenceOption.OnDelete('CASCADE')
private user_id!: number;

@Join(User)
private user!: User;

@Column.String(255)
@ColumnOption.NotNullable()
private title!: string;

public getId(): number {
return this.id;
}

public getUser(): User {
return this.user;
}
}

Options de référence :

  • InTable(table) : la table référencée ;
  • OnDelete(action) et OnUpdate(action) : 'CASCADE', 'SET NULL', 'RESTRICT'… ;
  • WithKeyName(nom) : le nom de la contrainte ;
  • Deferrable(type) : le mode de contrôle différé de la contrainte (PostgreSQL).

Jointures​

@Join(Modèle) sur une propriété charge automatiquement la ligne liée à chaque lecture. Par défaut, la jointure :

  • est de type INNER ;
  • utilise la colonne <propriété>_id (ici user_id) ;
  • la compare à la colonne id de la table jointe.
const post = await Post.findOneById(1);
post?.getUser().getName(); // l'utilisateur est déjà chargé

Pour changer ces réglages, passez une colonne et des options :

@Join(User, 'author_id', {type: 'LEFT', alias: 'author', references: 'id'})
private author!: User;
  • type : 'INNER', 'LEFT', 'RIGHT', 'LEFT OUTER' ou 'RIGHT OUTER' ;
  • alias : l'alias de la table jointe, utile pour joindre deux fois la même table ;
  • operator : l'opérateur de comparaison (= par défaut) ;
  • references : la colonne de la table jointe (id par défaut).

Les jointures s'enchaînent : si User déclare lui-même des jointures, elles sont chargées aussi.

Lire la colonne de clé (post.user_id) renvoie l'identifiant de la ligne jointe, lu depuis l'objet chargé.