Model Hooks & Lifecycle
Hooks allow you to run logic before or after certain model actions. They are static methods on your model. Note: Hooks do not apply to joined models in queries from other models. example:
// This won't apply the hook on from the Post model (if exists)
const users = await User.query().join("posts", "posts.userId", "users.id").all();
// Same applies to Model Joins
const users = await User.query().join(Post, "userId", "id").all();
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
Hook | Signature | Description |
---|---|---|
beforeFetch | static beforeFetch(queryBuilder: ModelQueryBuilder<T>) | Runs before fetching data. Modify query here. |
afterFetch | static async afterFetch(data: T[]): Promise<T[]> | Runs after fetching data. Can transform results. |
beforeInsert | static async beforeInsert(data: any): Promise<void> | Runs before inserting data. Can modify input. |
beforeUpdate | static beforeUpdate(queryBuilder: ModelQueryBuilder<T>) | Runs before updating data. Modify query here. |
beforeDelete | static beforeDelete(queryBuilder: ModelQueryBuilder<T>) | Runs before deleting data. Modify query here. |
- `