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)etOnUpdate(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(iciuser_id) ; - la compare à la colonne
idde 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 (idpar 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é.