UNPKG

silvie

Version:

Typescript Back-end Framework

240 lines (239 loc) 15.7 kB
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; }