Skip to main content

Model Hooks & Lifecycle

Hooks allow you to run logic before or after certain model actions. They are static methods on your model.

Example: Soft Delete Filtering

import { Model, column } from 'hysteria-orm';
import { ModelQueryBuilder } from 'hysteria-orm';

export class User extends Model {
@column.integer({ primaryKey: true })
declare id: number;

@column()
declare name: string;

@column.date()
declare deletedAt: Date | null;

static beforeUpdate(queryBuilder: ModelQueryBuilder<User>): void {
queryBuilder.where('users.is_admin', false);
}

static beforeDelete(queryBuilder: ModelQueryBuilder<User>): void {
queryBuilder.where('users.is_admin', false);
}

static beforeFetch(queryBuilder: ModelQueryBuilder<User>): void {
queryBuilder.whereNull('users.deleted_at');
}

static beforeInsert(data: User[]): void {
data.isAdmin = false;
}

static afterFetch(data: User[]): User[] {
return data.filter((user) => user.deletedAt === null);
}
}

Available Hooks

HookSignatureDescription
beforeFetchstatic beforeFetch(queryBuilder: ModelQueryBuilder<T>)Runs before fetching data. Modify query here.
afterFetchstatic async afterFetch(data: T[]): Promise<T[]>Runs after fetching data. Can transform results.
beforeInsertstatic async beforeInsert(data: any): Promise<void>Runs before inserting data. Can modify input.
beforeUpdatestatic beforeUpdate(queryBuilder: ModelQueryBuilder<T>)Runs before updating data. Modify query here.
beforeDeletestatic beforeDelete(queryBuilder: ModelQueryBuilder<T>)Runs before deleting data. Modify query here.
  • `