QRepository
@quik/database / QRepository
Abstract Class: QRepository<TModel, TKeyType>
Defined in: database/src/repository/QRepository.ts:35
Abstract base repository class for database operations.
Extends
QObject
Type Parameters
TModel
TModel extends QModel
The model type
TKeyType
TKeyType = any
The type of the primary key (defaults to any)
Constructors
Constructor
protectednew QRepository<TModel,TKeyType>(model):QRepository<TModel,TKeyType>
Defined in: database/src/repository/QRepository.ts:46
Creates an instance of QRepository.
Parameters
model
Constructor<TModel>
The model constructor
Returns
QRepository<TModel, TKeyType>
Overrides
QObject.constructor
Properties
_model
protected_model:Constructor<TModel>
Defined in: database/src/repository/QRepository.ts:83
The model constructor
_primaryKey
protected_primaryKey:string|string[] ="id"
Defined in: database/src/repository/QRepository.ts:57
The primary key field name or array of field names
Default
"id"
_sample
protected_sample:TModel
Defined in: database/src/repository/QRepository.ts:39
Sample instance of the model used for reflection and type operations
Accessors
isMysql
Get Signature
get
protectedisMysql():boolean
Defined in: database/src/repository/QRepository.ts:109
Checks if the database is MySQL
Returns
boolean
knex
Get Signature
get
protectedknex():Knex
Defined in: database/src/repository/QRepository.ts:95
Gets the Knex instance for database operations
Returns
Knex
logger
Get Signature
get
protectedlogger():IQLogger
Defined in: core/src/QObject.ts:15
The logger getter for the object.
Returns
IQLogger
Inherited from
QObject.logger
model
Get Signature
get
protectedmodel():QueryBuilder<TModel>
Defined in: database/src/repository/QRepository.ts:88
Gets a query builder for the model
Returns
QueryBuilder<TModel>
modelConstructor
Get Signature
get
protectedmodelConstructor():Constructor<TModel>
Defined in: database/src/repository/QRepository.ts:76
Gets the model constructor
Returns
Constructor<TModel>
modelName
Get Signature
get
protectedmodelName():string
Defined in: database/src/repository/QRepository.ts:116
Gets the model name (entity name)
Returns
string
name
Get Signature
get name():
string
Defined in: core/src/QObject.ts:8
Returns
string
Inherited from
QObject.name
primaryKey
Get Signature
get primaryKey():
string|string[]
Defined in: database/src/repository/QRepository.ts:62
Gets the primary key field name or array of field names
Returns
string | string[]
Set Signature
set primaryKey(
key):void
Defined in: database/src/repository/QRepository.ts:69
Sets the primary key field name or array of field names
Parameters
key
string | string[]
Returns
void
select
Get Signature
get
protectedselect():QueryBuilder<TModel>
Defined in: database/src/repository/QRepository.ts:102
Gets a query builder with columns selected based on the model's database mapping
Returns
QueryBuilder<TModel>
Methods
applyBulkIdsConstraint()
protectedapplyBulkIdsConstraint(queryBuilder,ids):QueryBuilder<TModel>
Defined in: database/src/repository/QRepository.ts:1600
Applies a primary-key filter for multiple ids to a query builder.
Uses whereIn for simple keys and grouped OR predicates for composite keys.
Parameters
queryBuilder
QueryBuilder<TModel>
Query builder to constrain
ids
(TModel | TKeyType)[]
Primary key values or entity instances
Returns
QueryBuilder<TModel>
bulkCreate()
bulkCreate(
data):Promise<void>
Defined in: database/src/repository/QRepository.ts:689
Creates multiple entities in a single batch operation for improved performance.
This method efficiently handles bulk entity creation by:
- Processing input data (raw objects or existing model instances)
- Populating generated values that must exist before insert, such as UUID primary keys
- Validating all entities before database operations
- Performing a single database insert operation
Parameters
data
Partial<TModel>[]
Array of partial entity data or existing model instances to create. Each item can be either: - A plain object with entity properties - An existing QModel instance
Returns
Promise<void>
Throws
ValidationError If any entity fails validation
Throws
DatabaseError If the bulk insert operation fails
Example
// Create multiple users from plain objects
await userRepository.bulkCreate([
{ name: 'John Doe', email: 'john@example.com' },
{ name: 'Jane Smith', email: 'jane@example.com' }
]);
// Create from existing model instances
const users = [
userRepository.fill({ name: 'Alice', email: 'alice@example.com' }),
userRepository.fill({ name: 'Bob', email: 'bob@example.com' })
];
await userRepository.bulkCreate(users);
Performance
Use this method instead of multiple create() calls when inserting
large datasets as it performs significantly better by reducing
database round trips and transaction overhead.
See
- create For creating single entities with return values
- process For handling entities with different row states
bulkDelete()
bulkDelete(
ids,force?):Promise<void>
Defined in: database/src/repository/QRepository.ts:809
Deletes multiple entities by primary key values or model instances.
Uses a single query for simple primary keys. Composite primary keys reuse the single-entity delete path to preserve query correctness.
Parameters
ids
(TModel | TKeyType)[]
Array of primary key values or existing entity instances
force?
boolean
Whether to force delete instead of soft delete
Returns
Promise<void>
bulkUpdate()
bulkUpdate(
ids,data):Promise<void>
Defined in: database/src/repository/QRepository.ts:703
Updates multiple entities with the same partial data using a single SQL update.
Parameters
ids
(TModel | TKeyType)[]
Array of primary key values or existing entity instances
data
Partial<TModel>
Partial data applied to every matched row
Returns
Promise<void>
cleanEmptyKeys()
protectedcleanEmptyKeys(data):Record<string,unknown>
Defined in: database/src/repository/QRepository.ts:1701
Removes null/undefined and empty object literals from an object graph.
Parameters
data
Record<string, unknown>
Returns
Record<string, unknown>
count()
count(
findOptions?):Promise<number>
Defined in: database/src/repository/QRepository.ts:1062
Counts the number of entities matching the specified conditions.
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering entities to count
Returns
Promise<number>
Throws
DatabaseError If the count operation fails
Example
// Count all entities
const totalUsers = await userRepository.count();
// Count with conditions
const activeUserCount = await userRepository.count({
where: { status: 'active' }
});
// Count with complex conditions
const recentUserCount = await userRepository.count({
where: [{
field: 'createdAt',
operator: 'gt',
value: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) // 7 days ago
}]
});
Performance
More efficient than retrieving entities and counting them in memory
See
countBy()
Call Signature
countBy<
TResult>(findOptions):Promise<TResult[]>
Defined in: database/src/repository/QRepository.ts:1096
Counts entities grouped by selected fields and returns raw aggregate rows.
Type Parameters
TResult
TResult extends Record<string, unknown> = Record<string, unknown>
Parameters
findOptions
QGroupedCountOptions<TModel>
Grouped count options
Returns
Promise<TResult[]>
Example
const rows = await requestRepository.countBy<{
date: string;
status: string;
count: number;
}>({
select: [
{ field: 'createdAt', as: 'date', transform: 'date' },
'status'
],
count: { field: 'id' },
sort: [{ field: 'date', direction: 'asc' }]
});
Call Signature
countBy<
TEntity>(entity,findOptions):Promise<TEntity[]>
Defined in: database/src/repository/QRepository.ts:1099
Counts entities grouped by selected fields and returns raw aggregate rows.
Type Parameters
TEntity
TEntity extends QEntity
Parameters
entity
Constructor<TEntity>
findOptions
QGroupedCountOptions<TModel>
Grouped count options
Returns
Promise<TEntity[]>
Example
const rows = await requestRepository.countBy<{
date: string;
status: string;
count: number;
}>({
select: [
{ field: 'createdAt', as: 'date', transform: 'date' },
'status'
],
count: { field: 'id' },
sort: [{ field: 'date', direction: 'asc' }]
});
create()
create(
data):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:616
Creates a single entity and returns the created instance with generated fields.
This method handles entity creation by:
- Processing input data (raw object or existing model instance)
- Populating generated values that must exist before insert, such as UUID primary keys
- Validating the entity before database operations
- Inserting into database and retrieving generated fields (like auto-increment IDs) while preserving application-generated UUID values when the database returns scalar insert results
- Returning the complete entity instance
Parameters
data
Partial<TModel>
The entity data or existing model instance to create. Can be either: - A plain object with entity properties - An existing QModel instance
Returns
Promise<TModel>
Throws
ValidationError If the entity fails validation
Throws
DatabaseError If the insert operation fails
Example
// Create from plain object
const user = await userRepository.create({
name: 'John Doe',
email: 'john@example.com'
});
console.log(user.id); // Auto-generated ID
// Create from existing model instance
const userModel = userRepository.fill({ name: 'Jane', email: 'jane@example.com' });
const created = await userRepository.create(userModel);
Performance
For bulk operations, consider using bulkCreate() instead
See
- bulkCreate For creating multiple entities efficiently
- update For modifying existing entities
delete()
delete(
id,force?):Promise<void>
Defined in: database/src/repository/QRepository.ts:785
Deletes an entity from the database, with support for soft delete.
This method handles entity deletion by:
- Retrieving the entity (if ID provided) or using provided instance
- Checking soft delete support and force parameter
- Either soft deleting (updating delete timestamp) or hard deleting
Parameters
id
TModel | TKeyType
The primary key value of the entity to delete, or an existing entity instance
force?
boolean
Whether to force delete (ignore soft delete), defaults to false
Returns
Promise<void>
Throws
ItemNotFoundError If no entity is found with the given id
Throws
DatabaseError If the delete operation fails
Example
// Soft delete (if supported by model)
await userRepository.delete(123);
// Force hard delete
await userRepository.delete(123, true);
// Delete existing entity instance
const user = await userRepository.findById(123);
await userRepository.delete(user);
See
deleteBy()
deleteBy(
where,force?):Promise<void>
Defined in: database/src/repository/QRepository.ts:865
Deletes multiple entities that match the specified conditions.
This method efficiently performs bulk deletion by:
- Building a query with the provided where conditions
- Checking soft delete support and force parameter
- Either updating the soft delete timestamp or performing hard deletion
Parameters
where
QWhereCondition | QWhereBuilder | QWhereCondition[] | Partial<{ [k in string | number | symbol]: TModel[k] }>
Conditions to match entities for deletion, can be: - A QWhereBuilder instance for complex conditions - A single QWhereCondition object - An array of QWhereCondition objects - A partial entity object with field values to match
force?
boolean
Whether to force delete (ignore soft delete), defaults to false
Returns
Promise<void>
Throws
DatabaseError If the delete operation fails
Example
// Delete all inactive users
await userRepository.deleteBy({ status: 'inactive' });
// Delete with complex conditions
await userRepository.deleteBy({
field: 'lastLoginDate',
operator: 'lt',
value: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000) // 90 days ago
});
// Force hard delete (bypass soft delete)
await userRepository.deleteBy({ role: 'guest' }, true);
Performance
This is more efficient than finding and deleting entities individually
See
endSpan()
protectedendSpan(span):void
Defined in: core/src/QObject.ts:35
End a span returned by startSpan.
Parameters
span
TelemetrySpan
The span to end.
Returns
void
Inherited from
QObject.endSpan
ensureGeneratedValues()
protectedensureGeneratedValues(item):void
Defined in: database/src/repository/QRepository.ts:1526
Populates generated fields that must exist before persistence.
UUID primary-generated columns are created in application code so inserts always receive a concrete identifier even when the database does not generate one automatically.
Parameters
item
TModel
Entity being prepared for persistence
Returns
void
fill()
protectedfill(options?,initial?,fillOptions?):TModel
Defined in: database/src/repository/QRepository.ts:1509
Internal
Creates and fills a new entity instance with the provided data.
This factory method handles entity creation by:
- Getting the entity class from the store
- Instantiating a new entity instance
- Filling it with the provided data
- Properly setting the row state based on whether it's a new or existing entity
fill() does not validate the entity or enforce uniqueness constraints. Use
create()/update() (or validate() directly) when you need validation.
Parameters
options?
Partial<ReferenceObject<TModel>>
The data to fill the entity with (properties and their values)
initial?
boolean = false
Whether this is an initial fill of an existing entity (affects row state)
fillOptions?
applyDefaults?
boolean
Returns
TModel
Example
// Create a new entity instance
const user = this.fill({ name: 'John', email: 'john@example.com' });
// Create from database (existing record)
const existingUser = this.fill(databaseRow, true);
Core method used throughout the repository for entity creation
See
- create For publicly creating and persisting entities
- modelBuilder For creating entities from database results
find()
find(
findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:328
Finds a single entity based on find options, returning null if not found.
This method provides safe entity retrieval by:
- Building query with provided options (excluding relations initially)
- Retrieving the first matching record
- Loading relations if specified
- Returning null instead of throwing when no entity found
This method provides safe entity retrieval by:
- Building query with provided options (excluding relations initially)
- Retrieving the first matching record
- Loading relations if specified
- Returning null instead of throwing when no entity found
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering and including relations
Returns
Promise<TModel>
Throws
DatabaseError If the query execution fails
Examples
// Find by condition
const user = await userRepository.find({
where: { email: 'user@example.com' }
});
if (user) {
console.log('User found:', user.name);
} else {
console.log('User not found');
}
// Find with relations
const userWithPosts = await userRepository.find({
where: { id: 123 },
relations: { posts: true }
});
// Find by condition
const user = await userRepository.find({
where: { email: 'user@example.com' }
});
if (user) {
console.log('User found:', user.name);
} else {
console.log('User not found');
}
// Find with relations
const userWithPosts = await userRepository.find({
where: { id: 123 },
relations: { posts: true }
});
See
- findFirst For finding with exception on not found
- findById For finding by primary key
- findFirst For finding with exception on not found
- findById For finding by primary key
findById()
findById(
id,options?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:571
Finds an entity by its primary key with optional related data loading.
This method provides a convenient way to retrieve entities when you know their ID by:
- Creating a where condition based on the primary key
- Finding the entity using findFirst with that condition
- Loading any specified relations
- Throwing an error if the entity doesn't exist
Parameters
id
TKeyType
The primary key value (single value for simple keys, object for composite keys)
options?
Relations to include in the result
Returns
Promise<TModel>
Throws
ItemNotFoundError If no entity is found with the given id
Throws
DatabaseError If the query execution fails
Example
// Find by ID without relations
const user = await userRepository.findById(123);
// Find by ID with relations
const userWithPosts = await userRepository.findById(123, {
relations: ['posts', 'profile']
});
// Find by composite key (if primaryKey is an array)
const orderItem = await orderItemRepository.findById({ orderId: 456, productId: 789 });
See
- find For finding with custom conditions without throwing
- findFirst For finding with custom conditions that throws
findDeleted()
findDeleted(
findOptions?):Promise<TModel[]>
Defined in: database/src/repository/QRepository.ts:944
Retrieve only soft-deleted entities.
Parameters
findOptions?
QFindOptions<TModel>
Returns
Promise<TModel[]>
Throws
SoftDeleteUnsupportedError If the model does not support soft delete.
Example
const deletedUsers = await userRepository.findDeleted();
finder()
protectedfinder(item,findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:1141
Internal
Finds an entity with its relations loaded based on find options.
Parameters
item
TModel
The base entity data from the initial query
findOptions?
QFindOptions<TModel>
Options containing relation specifications
Returns
Promise<TModel>
Throws
DatabaseError If relation loading fails
Example
// This is an internal method used by find, findFirst, etc.
// Used internally like:
const baseUser = await query.first();
return this.finder(baseUser, { relations: ['posts', 'profile'] });
Used by public find methods to load relations
See
- find For public API to find entities with relations
- modelBuilder For creating model instances from data
findFirst()
findFirst(
findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:411
Finds the first entity matching the provided find options and throws if not found.
This method is similar to find() but ensures an entity exists by:
- Building query with provided options
- Retrieving the first matching record
- Throwing an error if no entity is found
- Loading relations if specified
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering and including relations
Returns
Promise<TModel>
Throws
ItemNotFoundError If no entity is found
Throws
DatabaseError If the query execution fails
Example
try {
// Find first active admin user
const admin = await userRepository.findFirst({
where: { role: 'admin', status: 'active' }
});
// Admin is guaranteed to exist here
console.log(admin.name);
} catch (error) {
console.error('No admin user found');
}
See
findFirstOrNull()
findFirstOrNull(
findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:454
Finds the first entity matching the provided find options, returning null instead of throwing.
This method provides a safe way to use findFirst by:
- Attempting to retrieve the first matching entity
- Catching any exceptions, including ItemNotFoundError
- Always returning null in case of errors instead of propagating exceptions
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering and including relations
Returns
Promise<TModel>
Example
// Safe retrieval of first matching entity
const admin = await userRepository.findFirstOrNull({
where: { role: 'admin', status: 'active' }
});
// Safe to use without try/catch
if (admin) {
console.log('Admin found:', admin.name);
} else {
console.log('No admin found or error occurred');
}
See
- findFirst For finding with exception on not found
- findOrNull For finding any matching entity without throwing
findLast()
findLast(
findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:492
Finds the last entity matching the provided find options and throws if not found.
This method retrieves the last entity (by primary key order) by:
- Building query with provided options
- Ordering by primary key in descending order
- Retrieving the first result (which is the last by primary key)
- Throwing an error if no entity is found
- Loading relations if specified
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering and including relations
Returns
Promise<TModel>
Throws
ItemNotFoundError If no entity is found
Throws
DatabaseError If the query execution fails
Example
// Find the most recently created user (assuming id is auto-incremented)
const newestUser = await userRepository.findLast();
// Find the last active user by creation date
const lastActiveUser = await userRepository.findLast({
where: { status: 'active' },
sort: [{ field: 'createdAt', direction: 'desc' }]
});
See
findLastOrNull()
findLastOrNull(
findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:531
Finds the last entity matching the provided find options, returning null instead of throwing.
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering and including relations
Returns
Promise<TModel>
Example
const latestUser = await userRepository.findLastOrNull({
where: { status: 'active' }
});
See
findLast For finding the last matching entity with exceptions
findOrNull()
findOrNull(
findOptions?):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:372
Finds a single entity based on find options, returning null if not found or on error.
This method provides a safe way to find entities by:
- Attempting to retrieve an entity using the find method
- Catching any exceptions that might occur during the process
- Always returning null in case of any errors instead of propagating exceptions
Parameters
findOptions?
QFindOptions<TModel>
Options for filtering and including relations
Returns
Promise<TModel>
Example
// Safe retrieval that never throws
const user = await userRepository.findOrNull({
where: { email: 'user@example.com' },
relations: ['profile']
});
// Safe to use without try/catch
if (user) {
console.log('User found:', user.name);
} else {
console.log('User not found or error occurred');
}
See
- find For finding with null return but possible exceptions
- findFirst For finding with exception on not found
findWithDeleted()
findWithDeleted(
findOptions?):Promise<TModel[]>
Defined in: database/src/repository/QRepository.ts:964
Retrieve all entities, including soft-deleted ones.
Parameters
findOptions?
QFindOptions<TModel>
Returns
Promise<TModel[]>
Throws
SoftDeleteUnsupportedError If the model does not support soft delete.
Example
const allUsers = await userRepository.findWithDeleted();
get()
get(
findOptions?):Promise<TModel[]>
Defined in: database/src/repository/QRepository.ts:255
Retrieves a list of entities based on flexible find options.
This method provides comprehensive querying capabilities including:
- Filtering with where conditions
- Sorting and ordering
- Pagination with offset/limit
- Including related entities
- Data transformation and model building
Parameters
findOptions?
QFindOptions<TModel>
Comprehensive options for filtering, sorting, pagination, and relations
Returns
Promise<TModel[]>
Throws
DatabaseError If the query execution fails
Example
// Simple query
const users = await userRepository.get();
// With filtering and sorting
const activeUsers = await userRepository.get({
where: { status: 'active' },
sort: { name: 'asc' },
limit: 10
});
// With relations
const usersWithPosts = await userRepository.get({
relations: { posts: true }
});
Performance
Consider using pagination for large datasets
See
getEntityId()
protectedgetEntityId(item):TKeyType
Defined in: database/src/repository/QRepository.ts:1580
Internal
Extracts the primary key value from an entity for identification purposes.
This method retrieves ID values by:
- Checking if the primary key is single or composite
- For single keys, returning the value directly
- For composite keys, building an object with all key parts
- Maintaining the correct key structure for later operations
Parameters
item
TModel
The entity to extract the ID from
Returns
TKeyType
Examples
// For a simple primary key
const userId = this.getEntityId(user);
// Result: 123
// For a composite primary key
const orderLineId = this.getEntityId(orderLine);
// Result: { orderId: 456, lineId: 2 }
Used by various methods that need entity identification
// For a simple primary key
const userId = this.getEntityId(user);
// Result: 123
// For a composite primary key
const orderLineId = this.getEntityId(orderLine);
// Result: { orderId: 456, lineId: 2 }
Used by various methods that need entity identification
See
- getPrimaryKeyFromEntity For creating where conditions from entities
- getPrimaryKeyFromEntity For creating where conditions from entities
getFlaggedField()
protectedgetFlaggedField(flag):string
Defined in: database/src/repository/QRepository.ts:1381
Internal
Gets the first field name that has the specified flag in the model definition.
This utility method finds fields with specific metadata flags by:
- Searching through all model fields for a specific flag
- Returning the name of the first field with that flag
- Enabling generic operations based on field metadata
Parameters
flag
string
The flag name to search for (e.g., 'primary', 'generated', 'unique')
Returns
string
Example
// Find the primary key field
const pkField = this.getFlaggedField('primary');
// Find the auto-generated field
const generatedField = this.getFlaggedField('generated');
Used by various methods to work with flagged fields
See
QModel.getFlaggedField For the underlying implementation
getPrimaryKey()
protectedgetPrimaryKey(id): { [k in string | number | symbol]: TModel[k] }
Defined in: database/src/repository/QRepository.ts:1411
Internal
Converts a primary key value to a flattened where condition for queries.
This method handles both simple and composite primary keys by:
- Determining if the primary key is a single field or multiple fields
- Creating appropriate where conditions for each primary key component
- Formatting the conditions with table name qualification
- Supporting both simple values and complex objects for composite keys
Parameters
id
TKeyType
The primary key value (single value or object for composite keys)
Returns
{ [k in string | number | symbol]: TModel[k] }
Example
// For a simple primary key
const whereCondition = this.getPrimaryKey(123);
// Result: { 'User.id': 123 }
// For a composite primary key
const whereCondition = this.getPrimaryKey({ orderId: 456, lineId: 2 });
// Result: { 'OrderLine.orderId': 456, 'OrderLine.lineId': 2 }
Used by find and update operations to locate entities
See
getPrimaryKeyFromEntity For extracting keys from entity instances
getPrimaryKeyFromEntity()
protectedgetPrimaryKeyFromEntity(entity): { [k in string | number | symbol]: TModel[k] }
Defined in: database/src/repository/QRepository.ts:1460
Internal
Extracts the primary key values from an entity and formats them as a where condition.
This method extracts primary key data from an existing entity by:
- Determining if the primary key consists of one or multiple fields
- Extracting the primary key values from the entity
- Creating properly formatted where conditions with table qualification
- Supporting both simple and composite primary keys
Parameters
entity
TModel
The entity instance to extract primary key from
Returns
{ [k in string | number | symbol]: TModel[k] }
Example
// Extracting key from a user entity
const user = await userRepository.findById(123);
const whereCondition = this.getPrimaryKeyFromEntity(user);
// Result: { 'User.id': 123 }
// For an entity with composite key
const orderLine = await orderLineRepository.findById({orderId: 456, lineId: 2});
const whereCondition = this.getPrimaryKeyFromEntity(orderLine);
// Result: { 'OrderLine.orderId': 456, 'OrderLine.lineId': 2 }
Used for building where conditions from existing entities
See
- getPrimaryKey For creating conditions from raw key values
- getEntityId For extracting just the ID values without table qualification
joinQuery()
protectedjoinQuery<TResult>(resultEntity):QJoinQueryBuilder<TModel,TResult>
Defined in: database/src/repository/QRepository.ts:127
Starts a QJoinQueryBuilder for queries that join across tables not declared as @Relations on this
model and return a custom result shape, instead of instances of TModel.
Type Parameters
TResult
TResult extends QEntity
Parameters
resultEntity
Constructor<TResult>
@Entity()-decorated class describing the shape rows are mapped into.
Returns
QJoinQueryBuilder<TModel, TResult>
See
QJoinQueryBuilder For the fluent join/where/select API and usage examples.
modelBuilder()
protectedmodelBuilder(flattened):TModel
Defined in: database/src/repository/QRepository.ts:1204
Internal
Builds a complete model instance from flattened database data.
This method handles data transformation by:
- Removing null values from the flattened data
- Unflattening the hierarchical structure
- Creating a properly typed model instance
- Marking the instance as an existing database record
This method handles data transformation by:
- Removing null values from the flattened data
- Unflattening the hierarchical structure
- Creating a properly typed model instance
- Marking the instance as an existing database record
Parameters
flattened
{ [k in string | number | symbol]: TModel[k] }
The flattened data from database query results
Returns
TModel
Examples
// Used internally to convert raw database rows to model instances
const rawRows = await database.query();
return rawRows.map(row => this.modelBuilder(row));
Used by query methods to convert database rows to model instances
// Used internally to convert raw database rows to model instances
const rawRows = await database.query();
return rawRows.map(row => this.modelBuilder(row));
Used by query methods to convert database rows to model instances
See
- fill For creating new model instances
- transformData For processing raw database results
- fill For creating new model instances
- transformData For processing raw database results
modelBuilderFromObject()
protectedmodelBuilderFromObject(data):TModel
Defined in: database/src/repository/QRepository.ts:1212
Builds a model instance from an already-unflattened object.
Parameters
data
Partial<TModel>
Returns
TModel
paged()
paged<
TPagedEntity>(parameters?,relations?):Promise<TPagedEntity>
Defined in: database/src/repository/QRepository.ts:171
Retrieves a paginated list of entities with metadata about the pagination.
This method provides sophisticated pagination by:
- Calculating the total count of matching entities
- Determining correct page boundaries and navigation state
- Retrieving only the entities for the requested page
- Including pagination metadata like page counts and navigation flags
Type Parameters
TPagedEntity
TPagedEntity extends QPaginatedEntity<TModel> = QPaginatedEntity<TModel>
The paginated result type (defaults to QPaginatedEntity
Parameters
parameters?
Pagination configuration including page number, page size, and filters
relations?
Optional relations to include with the entities
Returns
Promise<TPagedEntity>
Throws
DatabaseError If any database operation fails
Example
// Basic pagination
const result = await userRepository.paged(
new QPaginatedParameters({ page: 2, size: 10 })
);
console.log(`Showing ${result.data.length} of ${result.count} results`);
console.log(`Page ${result.page} of ${Math.ceil(result.count / result.size)}`);
// Pagination with filtering and relations
const filteredResult = await userRepository.paged(
new QPaginatedParameters({
page: 1,
size: 25,
filter: { status: 'active' }
}),
{ relations: ['profile', 'posts'] }
);
Performance
Optimized for efficient data retrieval of large datasets
See
process()
process(...
items):Promise<TModel[]>
Defined in: database/src/repository/QRepository.ts:1010
Processes multiple entities based on their row state (created, modified, deleted).
This intelligent method handles mixed entity operations by:
- Examining each entity's row state flag
- Performing the appropriate operation (create, update, or delete)
- Collecting and returning the created/updated entities
Parameters
items
...TModel[]
The entities to process, each with an appropriate row state flag
Returns
Promise<TModel[]>
Throws
ValidationError If any entity fails validation
Throws
ItemNotFoundError If an entity to update/delete cannot be found
Throws
DatabaseError If any database operation fails
Example
// Create a mix of entities with different states
const newUser = userRepository.fill({ name: 'New User' });
newUser.rowState = QRowState.CREATED;
const existingUser = await userRepository.findById(123);
existingUser.name = 'Updated Name';
existingUser.rowState = QRowState.MODIFIED;
const userToDelete = await userRepository.findById(456);
userToDelete.rowState = QRowState.DELETED;
// Process all entities in a single call
const results = await userRepository.process(newUser, existingUser, userToDelete);
// results contains newUser and existingUser (not userToDelete as it was deleted)
Performance
More efficient than calling individual methods for each entity
See
- create For creating single entities
- update For updating single entities
- delete For deleting single entities
recordSpanError()
protectedrecordSpanError(span,err):void
Defined in: core/src/QObject.ts:45
Record an exception on an active span.
Parameters
span
TelemetrySpan
The span to record the error on.
err
unknown
The error to record.
Returns
void
Inherited from
QObject.recordSpanError
restore()
restore(
id):Promise<void>
Defined in: database/src/repository/QRepository.ts:921
Restores a previously soft-deleted entity by clearing its deletion timestamp.
Parameters
id
TKeyType
The primary key value of the entity to restore
Returns
Promise<void>
Throws
SoftDeleteUnsupportedError If the model doesn't support soft delete
Throws
ItemNotFoundError If no soft-deleted entity is found with the given id
Throws
DatabaseError If the restore operation fails
Example
try {
// Restore a previously deleted user
await userRepository.restore(123);
console.log('User restored successfully');
} catch (error) {
if (error instanceof SoftDeleteUnsupportedError) {
console.error('This model does not support soft delete');
} else if (error instanceof ItemNotFoundError) {
console.error('No deleted user found with that ID');
} else {
console.error('Failed to restore user:', error);
}
}
See
setSpanAttribute()
protectedsetSpanAttribute(span,key,value):void
Defined in: core/src/QObject.ts:64
Set a single attribute on an active span.
Parameters
span
TelemetrySpan
The span to update.
key
string
Attribute key.
value
string | number | boolean
Attribute value.
Returns
void
Inherited from
QObject.setSpanAttribute
skippableField()
protectedskippableField(definition):boolean
Defined in: database/src/repository/QRepository.ts:1283
Parameters
definition
QEntityProperty
Returns
boolean
startSpan()
protectedstartSpan(spanName,options?):TelemetrySpan
Defined in: core/src/QObject.ts:26
Start a telemetry span for the given operation name. Returns undefined when no telemetry provider is active.
Parameters
spanName
string
Name of the span.
options?
TelemetrySpanOptions
Optional span attributes and kind.
Returns
TelemetrySpan
Inherited from
QObject.startSpan
toDatabaseFields()
protectedtoDatabaseFields(data):Record<string,unknown>
Defined in: database/src/repository/QRepository.ts:1258
Internal
Converts a model instance to a database field map for persistence operations.
This method prepares entity data for database operations by:
- Mapping model property names to database column names
- Transforming special data types (like dates) to database-compatible formats
- Including only defined fields from the model
- Handling data type conversions for the specific database dialect
This method prepares entity data for database operations by:
- Mapping model property names to database column names
- Transforming special data types (like dates) to database-compatible formats
- Including only defined fields from the model
- Handling data type conversions for the specific database dialect
Parameters
data
TModel
The model instance to convert to database fields
Returns
Record<string, unknown>
Examples
// Used internally during save operations
const dbFields = this.toDatabaseFields(userModel);
await database.table('users').insert(dbFields);
Used by persistence methods to prepare data for database operations
// Used internally during save operations
const dbFields = this.toDatabaseFields(userModel);
await database.table('users').insert(dbFields);
Used by persistence methods to prepare data for database operations
See
- transformDateTime For handling date/time field conversions
- modelBuilder For the reverse operation (database to model)
- transformDateTime For handling date/time field conversions
- modelBuilder For the reverse operation (database to model)
transformData()
protectedtransformData<T>(data):T
Defined in: database/src/repository/QRepository.ts:1663
Internal
Transforms raw database query results into structured entity data.
This complex method handles result transformation by:
- Converting flattened database rows to hierarchical objects
- Parsing and correctly formatting date/time fields
- Handling nested relations and many-to-many associations
- Building complete object graphs from joined query results
This complex method handles result transformation by:
- Converting flattened database rows to hierarchical objects
- Parsing and correctly formatting date/time fields
- Handling nested relations and many-to-many associations
- Building complete object graphs from joined query results
- Supporting both single entity and collection transformations
Type Parameters
T
T = Record<string, any>[]
The expected return type (typically an array of records)
Parameters
data
T
The raw data from database queries to transform
Returns
T
Examples
// Used internally after database queries
const rawResults = await knex('users').leftJoin('profiles', 'users.id', 'profiles.user_id');
const transformedData = this.transformData(rawResults);
// Result: Hierarchical user objects with nested profile objects
Core data transformation method used by query methods
// Used internally after database queries
const rawResults = await knex('users').leftJoin('profiles', 'users.id', 'profiles.user_id');
const transformedData = this.transformData(rawResults);
// Result: Hierarchical user objects with nested profile objects
Core data transformation method used by query methods
See
- modelBuilder For converting transformed data to model instances
- _parseDateItem For handling individual record parsing
- modelBuilder For converting transformed data to model instances
- _parseDateItem For handling individual record parsing
transformDataRaw()
protectedtransformDataRaw<T>(data):T
Defined in: database/src/repository/QRepository.ts:1682
Transforms raw database data into unflattened objects for relation-heavy queries.
Type Parameters
T
T = Record<string, any>[]
Parameters
data
T
Returns
T
transformDateTime()
protectedtransformDateTime(definition,value):any
Defined in: database/src/repository/QRepository.ts:1336
Internal
Transforms date and datetime fields to database-compatible formats.
This method handles date/time conversions by:
- Checking if the field is marked as a date or datetime type
- Converting JavaScript Date objects or ISO strings to SQL-compatible formats
- Ensuring proper formatting based on field type (date vs. datetime)
- Returning non-date values unchanged
This method handles date/time conversions by:
- Checking if the field is marked as a date or datetime type
- Converting JavaScript Date objects or ISO strings to SQL-compatible formats
- Ensuring proper formatting based on field type (date vs datetime)
- Returning non-date values unchanged
Parameters
definition
QEntityProperty
The field definition form the model
value
any
The value to transform
Returns
any
Examples
// Used internally during database field mapping
result['created_at'] = this.transformDateTime('createdAt', model.createdAt);
// For a date field: '2023-06-15'
// For a datetime field: '2023-06-15 14:30:00'
Used by toDatabaseFields to handle date conversions
// Used internally during database field mapping
result['created_at'] = this.transformDateTime('createdAt', model.createdAt);
// For a date field: '2023-06-15'
// For a datetime field: '2023-06-15 14:30:00'
Used by toDatabaseFields to handle date conversions
See
- toDatabaseFields For complete entity to database conversion
- toDatabaseFields For complete entity to database conversion
update()
update(
id,data):Promise<TModel>
Defined in: database/src/repository/QRepository.ts:744
Updates an existing entity with new data and returns the updated instance.
This method handles entity updates by:
- Retrieving the existing entity (if ID provided) or using provided instance
- Applying the new data to the entity
- Validating the updated entity
- Persisting changes to the database
Parameters
id
TModel | TKeyType
The primary key value of the entity to update, or an existing entity instance
data
Partial<TModel>
The partial data to update the entity with
Returns
Promise<TModel>
Throws
ItemNotFoundError If no entity is found with the given id
Throws
ValidationError If the updated entity fails validation
Throws
DatabaseError If the update operation fails
Example
// Update by ID
const updatedUser = await userRepository.update(123, {
name: 'Updated Name',
email: 'new@example.com'
});
// Update existing entity instance
const user = await userRepository.findById(123);
const updated = await userRepository.update(user, { name: 'New Name' });