Aller au contenu principal

Modèles

Un modèle est une classe qui étend QueryRow, décorée avec @Table. Chaque colonne est une propriété décorée.

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

@Table('users')
export class User extends QueryRow {
@Column.Increment()
@ColumnOption.Primary()
@ColumnOption.NotNullable()
@ColumnOption.Unsigned()
private id!: number;

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

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

@Column.Boolean()
@ColumnOption.NotNullable()
@ColumnOption.DefaultTo(true)
private active!: boolean;

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

public getName(): string {
return this.name;
}

public setName(name: string): this {
this.name = name;
return this;
}

public setEmail(email: string): this {
this.email = email;
return this;
}
}

getId() obligatoire​

update(), delete() et createOrUpdate() identifient la ligne avec getId(). La méthode de base lève une erreur : chaque modèle doit l'implémenter. La colonne d'identifiant s'appelle id.

Accesseurs​

Les colonnes sont en général privées, lues et modifiées par des accesseurs. orm accessor les génère pour vous, voir la CLI. Faire renvoyer this aux setters permet de les enchaîner :

await User.new().setName('Alice').setEmail('alice@example.com').create();

Types de colonnes​

@Column reprend les types de colonnes de Knex :

  • Entiers : Increment(options?), Integer(length?), Tinyint(length?), Smallint(), Mediumint(), Bigint(), BigInteger().
  • Décimaux : Float(precision?, scale?), Double(precision?, scale?), Decimal(precision?, scale?).
  • Texte : String(length?), Text(type?) ('text', 'mediumtext' ou 'longtext'), Uuid(options?).
  • Dates : Date(), DateTime(options?), Time(), Timestamp(options?) (options : useTz, precision).
  • Autres : Boolean(), Enum(values, options?) (alias Enu), Json(), Jsonb(), Binary(length?), Point().

Options de colonne​

@ColumnOption ajoute des contraintes :

  • Clés et index : Primary(options?), Unique(options?), Index(indexName?).
  • Valeurs : NotNullable(), Nullable(), DefaultTo(value, options?), Unsigned().
  • Contrôles : CheckPositive(), CheckNegative(), CheckIn(values), CheckNotIn(values), CheckBetween(values), CheckLength(operator, length), CheckRegex(regex). Chacun accepte un nom de contrainte en dernier argument.
  • Divers : Comment(text), Collate(collation), References(column) pour une clé étrangère, voir les relations.

Transformer les valeurs​

@Transform.Hydrate(fn) transforme une valeur lue en base, @Transform.DeHydrate(fn) une valeur avant son écriture :

import {Column, QueryRow, Table, Transform} from '@fca.gg/orm';

@Table('settings')
export class Settings extends QueryRow {
@Column.Text()
@Transform.Hydrate((value) => JSON.parse(value))
@Transform.DeHydrate((value) => JSON.stringify(value))
private data!: Record<string, unknown>;
}

Les deux décorateurs acceptent aussi un nom de propriété en premier argument, pour garder la valeur brute dans la colonne et travailler sur une autre propriété :

  • @Transform.Hydrate('parsed', fn) : à la lecture, parsed reçoit fn(valeur brute) ;
  • @Transform.DeHydrate('parsed', fn) : à l'écriture, la colonne reçoit fn(parsed).