BaseModelClass is the base class that all Models inherit from, providing core functionality for database access, query execution, and transaction management.
Database Access Methods
getDB(preset)
Returns a Knex database connection.preset:"r"(read) or"w"(write)
DBPreset types:
"r": Read - Read-only (SELECT)"w": Write - Writable (INSERT, UPDATE, DELETE)
getPuri(preset)
Returns a Puri query builder. Automatically uses transaction connection when a transaction is active.preset:"r"(read) or"w"(write)
Subset Query Methods
getSubsetQueries(subset)
Returns a query builder for a specific Subset.qb: Query builder (for adding conditions)onSubset: Subset-specific type casting function
executeSubsetQuery(params)
Executes a Subset query and returns results. Automatically handles pagination, Loader, Hydration, and Enhancer.
queryMode options:
Usage examples:
Execution order: 1. Execute COUNT query (calculate total) 2. Execute LIST query (apply
pagination) 3. Execute Loader (load HasMany, ManyToMany data) 4. Hydrate (flat object → nested
object conversion) 5. Apply Enhancer (calculate virtual fields) 6. Remove Internal fields
createEnhancers(enhancers)
Helper function to create Enhancer objects. Provides type validation and inference.Utility Methods
getInsertedIds(wdb, rows, tableName, unqKeyFields, chunkSize)
Retrieves IDs of inserted records. Useful after upsert since it queries based on Unique keys.
Usage examples:
hydrate(rows)
Converts flat records to nested objects. Transformstable__field format from JOIN results to objects.
user__name→{ user: { name } }user__profile__bio→{ user: { profile: { bio } } }- If nullable relation’s id is null, the entire object becomes null
hydrate() is automatically called inside executeSubsetQuery(), so you rarely need to call it
directly.omitInternalFields(row, fields)
Removes Internal fields from an object. Also handles nested fields and arrays.Fields specified with the
internal option in Subset are automatically removed in executeSubsetQuery().destroy()
Closes database connections. Usually called when the application terminates.Practical Usage Patterns
Standard findMany Pattern
Complex Filtering Pattern
Custom Aggregation Query
Next Steps
Puri Query Builder
Type-safe query builder usage
Subset
Data retrieval using Subsets
Transactions
Detailed transaction management guide
Testing
Writing Model tests