silvie
Version:
Typescript Back-end Framework
240 lines (239 loc) • 15.7 kB
TypeScript
import { TColumn, TOperator, TTable, TBaseValue } from "../builders/condition";
import WhereConditionBuilder from "../builders/condition/where";
import QueryBuilder from "../builders/query";
import HavingConditionBuilder from "../builders/condition/having";
import JoinConditionBuilder from "../builders/condition/join";
export interface IModel {
fill(data: any): void;
fresh(): Promise<IModel>;
refresh(): Promise<void>;
update(data: any, silent: boolean): Promise<number>;
delete(): Promise<any>;
forceDelete(): Promise<number>;
save(): Promise<number>;
}
export type IModelRelation = {
type: 'HasMany' | 'HasOne' | 'BelongsToMany' | 'BelongsTo';
count: 'one' | 'many';
model: any;
localKey: string | string[];
remoteKey: string | string[];
};
export default class ModelQueryBuilder {
protected static tableName: string;
protected static primaryKey: string | string[];
protected static useTimestamps: boolean;
protected static createTimestamp: string;
protected static updateTimestamp: string;
protected static useSoftDeletes: boolean;
protected static softDeleteTimestamp: string;
static relations: Record<string, IModelRelation>;
/**
* Create a new instance of this model from a initial data object
* @param initialData
*/
constructor(initialData?: any);
/**
* The table name for this model
*/
static get table(): string;
/**
* Cast a RawDataPacket into the current model
* @param data
*/
protected static cast(data: any): ModelQueryBuilder;
/**
* Cast an array of RawDataPackets into the current model
* @param data
*/
protected static castAll(data: any[]): ModelQueryBuilder[];
/**
* Create many to many relation
* @param model
* @param foreignKey
* @param primaryKey
*/
static hasMany(model: any, foreignKey: string, primaryKey?: string): IModelRelation;
/**
* Create one to one relation
* @param model
* @param foreignKey
* @param primaryKey
*/
static hasOne(model: any, foreignKey: string, primaryKey?: string): IModelRelation;
/**
* Create one to many relation
* @param model
* @param foreignKey
* @param primaryKey
*/
static belongsTo(model: any, foreignKey: string, primaryKey?: string): IModelRelation;
/**
* Creates reversed many to many relation
* @param model
* @param foreignKey
* @param primaryKey
*/
static belongsToMany(model: any, foreignKey: string, primaryKey?: string): IModelRelation;
/**
* Specify the relations you want to be fetched along with the main query
* @param relationNames
*/
static with(...relationNames: string[]): QueryBuilder;
private static processResults;
static extendBaseQueryBuilder(queryBuilder?: QueryBuilder): QueryBuilder;
/**
* Configures a query builder to match this model table and configuration
*/
static get baseQueryBuilder(): QueryBuilder;
/**
* Configures a query builder to match with this model's primary key
* @param queryBuilder Query builder instance to add conditions to
* @param thisRef Uses the current instance properties to get primary key values
* @param ids ID or IDs to search for
*/
static primaryKeyCondition(queryBuilder: QueryBuilder, thisRef: ModelQueryBuilder, ids?: any[]): QueryBuilder;
/**
* Insert a data array into the table and return with [LastInsertId, AffectedRows]
* @param data
* @param ignore Weather to ignore duplicate keys or not
*/
static insert(data: any[], ignore?: boolean): Promise<[number, number]>;
/**
* Delete a record of this kind (uses soft delete if it is enabled in model)
* @param id
*/
static delete(id: TBaseValue | TBaseValue[]): Promise<number>;
/**
* Delete all the records of this kind (uses soft delete if it is enabled in model)
* @param ids
*/
static deleteAll(...ids: (TBaseValue | TBaseValue[])[]): Promise<number>;
/**
* Restore a soft deleted record of this kind
* @param id
*/
static restore(id: TBaseValue | TBaseValue[]): Promise<number>;
/**
* Restore soft deleted records of this kind
* @param ids
*/
static restoreAll(...ids: (TBaseValue | TBaseValue[])[]): Promise<number>;
static bulkUpdate(data: any[], keys?: string[], silent?: boolean): Promise<any>;
/**
* Delete a record of this kind
* @param id
*/
static forceDelete(id: TBaseValue | TBaseValue[]): Promise<number>;
/**
* Delete all the records of this kind
* @param ids
*/
static forceDeleteAll(...ids: (TBaseValue | TBaseValue[])[]): Promise<number>;
/**
* Create a base query builder configured to reach the current instance matching record
*/
protected get baseQueryBuilder(): QueryBuilder;
static pluck(keyColumn: TColumn, valueColumn?: TColumn, override?: boolean): Promise<any>;
static count(): Promise<number>;
static average(column: TColumn): Promise<number>;
static sum(column: TColumn): Promise<number>;
static min(column: TColumn): Promise<any>;
static max(column: TColumn): Promise<any>;
static withTrashed(): QueryBuilder;
static onlyTrashed(): QueryBuilder;
static withoutTrashed(): QueryBuilder;
static sharedLock(): QueryBuilder;
static lockForUpdate(): QueryBuilder;
static clearLock(): QueryBuilder;
static into(variableName: string): QueryBuilder;
static select(...columns: TColumn[]): QueryBuilder;
static selectSub(queryBuilder: QueryBuilder, alias: string): QueryBuilder;
static selectRaw(query: string, params?: TBaseValue[]): QueryBuilder;
static orderBy(column: TColumn | QueryBuilder, direction?: 'asc' | 'desc' | 'ASC' | 'DESC'): QueryBuilder;
static orderByRaw(query: string, params?: TBaseValue[]): QueryBuilder;
static reorder(column?: TColumn, direction?: 'asc' | 'desc' | 'ASC' | 'DESC'): QueryBuilder;
static shuffle(seed?: string): QueryBuilder;
static offset(count: number): QueryBuilder;
static skip(count: number): QueryBuilder;
static limit(count: number): QueryBuilder;
static take(count: number): QueryBuilder;
static selectCount(alias: string): QueryBuilder;
static selectAverage(column: TColumn, alias: string): QueryBuilder;
static selectSum(column: TColumn, alias: string): QueryBuilder;
static selectMin(column: TColumn, alias: string): QueryBuilder;
static selectMax(column: TColumn, alias: string): QueryBuilder;
static groupBy(...columns: TColumn[]): QueryBuilder;
static groupByRaw(query: string, params?: TBaseValue[]): QueryBuilder;
static union(queryBuilder: QueryBuilder, all?: boolean): QueryBuilder;
static unionRaw(query: string, params?: TBaseValue[], all?: boolean): QueryBuilder;
static join(table: TTable | QueryBuilder, column1: TColumn | ((conditionBuilder: JoinConditionBuilder) => void), operator?: TOperator | TColumn, column2?: TColumn, alias?: string): QueryBuilder;
static leftJoin(table: TTable | QueryBuilder, column1: TColumn | ((conditionBuilder: JoinConditionBuilder) => void), operator?: TOperator | TColumn, column2?: TColumn, alias?: string): QueryBuilder;
static rightJoin(table: TTable | QueryBuilder, column1: TColumn | ((conditionBuilder: JoinConditionBuilder) => void), operator?: TOperator | TColumn, column2?: TColumn, alias?: string): QueryBuilder;
static crossJoin(table: TTable | QueryBuilder, column1: TColumn | ((conditionBuilder: JoinConditionBuilder) => void), operator?: TOperator | TColumn, column2?: TColumn, alias?: string): QueryBuilder;
static outerJoin(table: TTable | QueryBuilder, column1: TColumn | ((conditionBuilder: JoinConditionBuilder) => void), operator?: TOperator | TColumn, column2?: TColumn, alias?: string): QueryBuilder;
static where(column: TColumn | QueryBuilder | ((conditionBuilder: WhereConditionBuilder) => void), operator?: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orWhere(column: TColumn | QueryBuilder | ((conditionBuilder: WhereConditionBuilder) => void), operator?: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static whereNull(column: TColumn | QueryBuilder): QueryBuilder;
static orWhereNull(column: TColumn | QueryBuilder): QueryBuilder;
static whereNotNull(column: TColumn | QueryBuilder): QueryBuilder;
static orWhereNotNull(column: TColumn | QueryBuilder): QueryBuilder;
static whereBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static orWhereBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static whereNotBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static orWhereNotBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static whereIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static orWhereIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static whereNotIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static orWhereNotIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static whereLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static orWhereLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static whereNotLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static orWhereNotLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static whereColumn(firstColumn: TColumn, operator: TOperator | TColumn, secondColumn?: TColumn): QueryBuilder;
static orWhereColumn(firstColumn: TColumn, operator: TOperator | TColumn, secondColumn?: TColumn): QueryBuilder;
static whereDate(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orWhereDate(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static whereYear(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orWhereYear(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static whereMonth(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orWhereMonth(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static whereDay(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orWhereDay(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static whereTime(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orWhereTime(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static whereRaw(query: string, params?: TBaseValue[]): QueryBuilder;
static orWhereRaw(query: string, params?: TBaseValue[]): QueryBuilder;
static having(column: TColumn | QueryBuilder | ((conditionBuilder: HavingConditionBuilder) => void), operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orHaving(column: TColumn | QueryBuilder | ((conditionBuilder: HavingConditionBuilder) => void), operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static havingNull(column: TColumn | QueryBuilder): QueryBuilder;
static orHavingNull(column: TColumn | QueryBuilder): QueryBuilder;
static havingNotNull(column: TColumn | QueryBuilder): QueryBuilder;
static orHavingNotNull(column: TColumn | QueryBuilder): QueryBuilder;
static havingBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static orHavingBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static havingNotBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static orHavingNotBetween(column: TColumn | QueryBuilder, values: [TBaseValue, TBaseValue] | QueryBuilder): QueryBuilder;
static havingIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static orHavingIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static havingNotIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static orHavingNotIn(column: TColumn | QueryBuilder, values: TBaseValue[] | QueryBuilder): QueryBuilder;
static havingLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static orHavingLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static havingNotLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static orHavingNotLike(column: TColumn | QueryBuilder, value: string): QueryBuilder;
static havingColumn(firstColumn: TColumn, operator: TOperator | TColumn, secondColumn?: TColumn): QueryBuilder;
static orHavingColumn(firstColumn: TColumn, operator: TOperator | TColumn, secondColumn?: TColumn): QueryBuilder;
static havingDate(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orHavingDate(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static havingYear(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orHavingYear(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static havingMonth(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orHavingMonth(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static havingDay(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orHavingDay(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static havingTime(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static orHavingTime(column: TColumn | QueryBuilder, operator: TOperator | TBaseValue | QueryBuilder, value?: TBaseValue | QueryBuilder): QueryBuilder;
static havingRaw(query: string, params?: TBaseValue[]): QueryBuilder;
static orHavingRaw(query: string, params?: TBaseValue[]): QueryBuilder;
}