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?)(aliasEnu),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,parsedreçoitfn(valeur brute);@Transform.DeHydrate('parsed', fn): à l'écriture, la colonne reçoitfn(parsed).