UNPKG

31.2 kBTypeScriptView Raw
1declare module '@ioc:Adonis/Lucid/Orm' {
2 import { RawQuery, OneOrMany, StrictValues, QueryCallback, ChainableContract, RawBuilderContract, QueryClientContract, TransactionClientContract } from '@ioc:Adonis/Lucid/Database';
3 /**
4 * ------------------------------------------------------
5 * Helpers
6 * ------------------------------------------------------
7 */
8 /**
9 * Extracts relationship attributes from the model
10 */
11 type ExtractModelRelations<Model extends LucidRow> = {
12 [Key in keyof Model]: Model[Key] extends ModelRelations ? Key : never;
13 }[keyof Model];
14 /**
15 * Returns relationship model instance or array of instances based
16 * upon the relationship type
17 */
18 type GetRelationModelInstance<Relation extends ModelRelations> = Relation['__opaque_type'] extends 'hasOne' | 'belongsTo' ? Relation['instance'] : Relation['instance'][];
19 /**
20 * ------------------------------------------------------
21 * Options
22 * ------------------------------------------------------
23 */
24 /**
25 * Options accepted when defining a new relationship. Certain
26 * relationships like `manyToMany` have their own options
27 */
28 type RelationOptions<Related extends ModelRelations> = {
29 localKey?: string;
30 foreignKey?: string;
31 serializeAs?: string | null;
32 onQuery?(query: Related['builder'] | Related['subQuery']): void;
33 };
34 /**
35 * Options accepted by many to many relationship
36 */
37 type ManyToManyRelationOptions<Related extends ModelRelations> = {
38 pivotTable?: string;
39 localKey?: string;
40 pivotForeignKey?: string;
41 relatedKey?: string;
42 pivotRelatedForeignKey?: string;
43 pivotColumns?: string[];
44 pivotTimestamps?: boolean | {
45 createdAt: string | boolean;
46 updatedAt: string | boolean;
47 };
48 serializeAs?: string | null;
49 onQuery?(query: Related['builder'] | Related['subQuery']): void;
50 };
51 /**
52 * Options accepted by through relationships
53 */
54 type ThroughRelationOptions<Related extends ModelRelations> = RelationOptions<Related> & {
55 throughLocalKey?: string;
56 throughForeignKey?: string;
57 throughModel: () => LucidModel;
58 };
59 /**
60 * ------------------------------------------------------
61 * Decorators
62 * ------------------------------------------------------
63 */
64 /**
65 * Decorator signature to define has one relationship
66 */
67 type HasOneDecorator = <RelatedModel extends LucidModel>(model: () => RelatedModel, options?: RelationOptions<HasOne<RelatedModel>>) => TypedDecorator<HasOne<RelatedModel>>;
68 /**
69 * Decorator signature to define has many relationship
70 */
71 type HasManyDecorator = <RelatedModel extends LucidModel>(model: () => RelatedModel, options?: RelationOptions<HasOne<RelatedModel>>) => TypedDecorator<HasMany<RelatedModel>>;
72 /**
73 * Decorator signature to define belongs to relationship
74 */
75 type BelongsToDecorator = <RelatedModel extends LucidModel>(model: () => RelatedModel, options?: RelationOptions<HasOne<RelatedModel>>) => TypedDecorator<BelongsTo<RelatedModel>>;
76 /**
77 * Decorator signature to define many to many relationship
78 */
79 type ManyToManyDecorator = <RelatedModel extends LucidModel>(model: () => RelatedModel, column?: ManyToManyRelationOptions<ManyToMany<RelatedModel>>) => TypedDecorator<ManyToMany<RelatedModel>>;
80 /**
81 * Decorator signature to define has many through relationship
82 */
83 type HasManyThroughDecorator = <RelatedModel extends LucidModel>(model: [() => RelatedModel, () => LucidModel], column?: Omit<ThroughRelationOptions<HasManyThrough<RelatedModel>>, 'throughModel'>) => TypedDecorator<HasManyThrough<RelatedModel>>;
84 /**
85 * ------------------------------------------------------
86 * Opaque typed relationships
87 * ------------------------------------------------------
88 *
89 * They have no runtime relevance, just a way to distinguish
90 * between standard model properties and relationships
91 *
92 */
93 type ModelRelationTypes = {
94 readonly __opaque_type: 'hasOne' | 'hasMany' | 'belongsTo' | 'manyToMany' | 'hasManyThrough';
95 };
96 /**
97 * Opaque type for has one relationship
98 */
99 type HasOne<RelatedModel extends LucidModel, ParentModel extends LucidModel = LucidModel> = InstanceType<RelatedModel> & {
100 readonly __opaque_type: 'hasOne';
101 model: RelatedModel;
102 instance: InstanceType<RelatedModel>;
103 client: HasOneClientContract<HasOneRelationContract<ParentModel, RelatedModel>, RelatedModel>;
104 builder: RelationQueryBuilderContract<RelatedModel, any>;
105 subQuery: RelationSubQueryBuilderContract<RelatedModel>;
106 };
107 /**
108 * Opaque type for has many relationship
109 */
110 type HasMany<RelatedModel extends LucidModel, ParentModel extends LucidModel = LucidModel> = InstanceType<RelatedModel>[] & {
111 readonly __opaque_type: 'hasMany';
112 model: RelatedModel;
113 instance: InstanceType<RelatedModel>;
114 client: HasManyClientContract<HasManyRelationContract<ParentModel, RelatedModel>, RelatedModel>;
115 builder: HasManyQueryBuilderContract<RelatedModel, any>;
116 subQuery: RelationSubQueryBuilderContract<RelatedModel>;
117 };
118 /**
119 * Opaque type for has belongs to relationship
120 */
121 type BelongsTo<RelatedModel extends LucidModel, ParentModel extends LucidModel = LucidModel> = InstanceType<RelatedModel> & {
122 readonly __opaque_type: 'belongsTo';
123 model: RelatedModel;
124 instance: InstanceType<RelatedModel>;
125 client: BelongsToClientContract<BelongsToRelationContract<ParentModel, RelatedModel>, RelatedModel>;
126 builder: RelationQueryBuilderContract<RelatedModel, any>;
127 subQuery: RelationSubQueryBuilderContract<RelatedModel>;
128 };
129 /**
130 * Opaque type for many to many relationship
131 */
132 type ManyToMany<RelatedModel extends LucidModel, ParentModel extends LucidModel = LucidModel> = InstanceType<RelatedModel>[] & {
133 readonly __opaque_type: 'manyToMany';
134 model: RelatedModel;
135 instance: InstanceType<RelatedModel>;
136 client: ManyToManyClientContract<ManyToManyRelationContract<ParentModel, RelatedModel>, RelatedModel>;
137 builder: ManyToManyQueryBuilderContract<RelatedModel, any>;
138 subQuery: ManyToManySubQueryBuilderContract<RelatedModel>;
139 };
140 /**
141 * Opaque type for many to many relationship
142 */
143 type HasManyThrough<RelatedModel extends LucidModel, ParentModel extends LucidModel = LucidModel> = InstanceType<RelatedModel>[] & {
144 readonly __opaque_type: 'hasManyThrough';
145 model: RelatedModel;
146 instance: InstanceType<RelatedModel>;
147 client: HasManyThroughClientContract<HasManyThroughRelationContract<ParentModel, RelatedModel>, RelatedModel>;
148 builder: HasManyThroughQueryBuilderContract<RelatedModel, any>;
149 subQuery: RelationSubQueryBuilderContract<RelatedModel>;
150 };
151 /**
152 * These exists on the models directly as a relationship. The idea
153 * is to distinguish relationship properties from other model
154 * properties.
155 */
156 type ModelRelations = HasOne<LucidModel, LucidModel> | HasMany<LucidModel, LucidModel> | BelongsTo<LucidModel, LucidModel> | ManyToMany<LucidModel, LucidModel> | HasManyThrough<LucidModel, LucidModel>;
157 /**
158 * ------------------------------------------------------
159 * Relationships
160 * ------------------------------------------------------
161 */
162 /**
163 * Interface to be implemented by all relationship types
164 */
165 interface BaseRelationContract<ParentModel extends LucidModel, RelatedModel extends LucidModel> {
166 readonly type: ModelRelationTypes['__opaque_type'];
167 readonly relationName: string;
168 readonly serializeAs: string | null;
169 readonly booted: boolean;
170 readonly model: ParentModel;
171 relatedModel(): RelatedModel;
172 boot(): void;
173 clone(parent: LucidModel): this;
174 /**
175 * Get client
176 */
177 client(parent: InstanceType<ParentModel>, client: QueryClientContract): unknown;
178 /**
179 * Get eager query for the relationship
180 */
181 eagerQuery(parent: OneOrMany<InstanceType<ParentModel>>, client: QueryClientContract): RelationQueryBuilderContract<RelatedModel, InstanceType<RelatedModel>>;
182 subQuery(client: QueryClientContract): RelationSubQueryBuilderContract<RelatedModel>;
183 }
184 /**
185 * Has one relationship interface
186 */
187 interface HasOneRelationContract<ParentModel extends LucidModel, RelatedModel extends LucidModel> extends BaseRelationContract<ParentModel, RelatedModel> {
188 readonly type: 'hasOne';
189 readonly localKey: string;
190 readonly foreignKey: string;
191 /**
192 * Set related model as a relationship on the parent model.
193 */
194 setRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel> | null): void;
195 /**
196 * Push related model as a relationship on the parent model
197 */
198 pushRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel> | null): void;
199 /**
200 * Set multiple related instances on the multiple parent models.
201 * This method is generally invoked during eager load.
202 *
203 * Fetch 10 users and then all profiles for all 10 users and then
204 * call this method to set related instances
205 */
206 setRelatedForMany(parent: InstanceType<ParentModel>[], related: InstanceType<RelatedModel>[]): void;
207 /**
208 * Returns the query client for one or many model instances. The query
209 * client then be used to fetch and persist relationships.
210 */
211 client(parent: InstanceType<ParentModel>, client: QueryClientContract): HasOneClientContract<this, RelatedModel>;
212 /**
213 * Hydrates related model attributes for persistance
214 */
215 hydrateForPersistance(parent: LucidRow, values: ModelObject | LucidRow): void;
216 }
217 /**
218 * Has many relationship interface
219 */
220 interface HasManyRelationContract<ParentModel extends LucidModel, RelatedModel extends LucidModel> extends BaseRelationContract<ParentModel, RelatedModel> {
221 readonly type: 'hasMany';
222 readonly localKey: string;
223 readonly foreignKey: string;
224 /**
225 * Set related models as a relationship on the parent model
226 */
227 setRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel>[]): void;
228 /**
229 * Push related model(s) as a relationship on the parent model
230 */
231 pushRelated(parent: InstanceType<ParentModel>, related: OneOrMany<InstanceType<RelatedModel>>): void;
232 /**
233 * Set multiple related instances on the multiple parent models.
234 * This method is generally invoked during eager load.
235 *
236 * Fetch 10 users and then all posts for all 10 users and then
237 * call this method to set related instances
238 */
239 setRelatedForMany(parent: InstanceType<ParentModel>[], related: InstanceType<RelatedModel>[]): void;
240 /**
241 * Returns the query client for one or many model instances. The query
242 * client then be used to fetch and persist relationships.
243 */
244 client(parent: InstanceType<ParentModel>, client: QueryClientContract): HasManyClientContract<this, RelatedModel>;
245 /**
246 * Hydrates related model attributes for persistance
247 */
248 hydrateForPersistance(parent: LucidRow, values: ModelObject | LucidRow): void;
249 }
250 /**
251 * Belongs to relationship interface
252 */
253 interface BelongsToRelationContract<ParentModel extends LucidModel, RelatedModel extends LucidModel> extends BaseRelationContract<ParentModel, RelatedModel> {
254 readonly type: 'belongsTo';
255 readonly localKey: string;
256 readonly foreignKey: string;
257 /**
258 * Set related model as a relationship on the parent model
259 */
260 setRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel> | null): void;
261 /**
262 * Push related model as a relationship on the parent model
263 */
264 pushRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel> | null): void;
265 /**
266 * Set multiple related instances on the multiple parent models.
267 * This method is generally invoked during eager load.
268 *
269 * Fetch 10 profiles and then users for all 10 profiles and then
270 * call this method to set related instances
271 */
272 setRelatedForMany(parent: InstanceType<ParentModel>[], related: InstanceType<RelatedModel>[]): void;
273 /**
274 * Returns the query client for a model instance
275 */
276 client(parent: InstanceType<ParentModel>, client: QueryClientContract): BelongsToClientContract<this, RelatedModel>;
277 /**
278 * Hydrates parent model attributes for persistance
279 */
280 hydrateForPersistance(parent: LucidRow, values: ModelObject | LucidRow): void;
281 }
282 /**
283 * Many to many relationship interface
284 */
285 interface ManyToManyRelationContract<ParentModel extends LucidModel, RelatedModel extends LucidModel> extends BaseRelationContract<ParentModel, RelatedModel> {
286 type: 'manyToMany';
287 readonly localKey: string;
288 readonly relatedKey: string;
289 readonly pivotForeignKey: string;
290 readonly pivotRelatedForeignKey: string;
291 readonly pivotTable: string;
292 pivotColumns: string[];
293 /**
294 * Set related models as a relationship on the parent model
295 */
296 setRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel>[]): void;
297 /**
298 * Push related model(s) as a relationship on the parent model
299 */
300 pushRelated(parent: InstanceType<ParentModel>, related: OneOrMany<InstanceType<RelatedModel>>): void;
301 /**
302 * Set multiple related instances on the multiple parent models.
303 * This method is generally invoked during eager load.
304 */
305 setRelatedForMany(parent: InstanceType<ParentModel>[], related: InstanceType<RelatedModel>[]): void;
306 /**
307 * Returns the query client for one model instance
308 */
309 client(parent: InstanceType<ParentModel>, client: QueryClientContract): ManyToManyClientContract<this, RelatedModel>;
310 /**
311 * Get eager query for the relationship
312 */
313 eagerQuery(parent: OneOrMany<InstanceType<ParentModel>>, client: QueryClientContract): ManyToManyQueryBuilderContract<RelatedModel, InstanceType<RelatedModel>>;
314 /**
315 * Get subquery for the relationships
316 */
317 subQuery(client: QueryClientContract): ManyToManySubQueryBuilderContract<RelatedModel>;
318 /**
319 * Returns key-value pair for the pivot table in relation to the parent model
320 */
321 getPivotPair(parent: LucidRow): [string, number | string];
322 /**
323 * Returns key-value pair for the pivot table in relation to the related model
324 */
325 getPivotRelatedPair(related: LucidRow): [string, number | string];
326 }
327 /**
328 * Has many through relationship interface
329 */
330 interface HasManyThroughRelationContract<ParentModel extends LucidModel, RelatedModel extends LucidModel> extends BaseRelationContract<ParentModel, RelatedModel> {
331 type: 'hasManyThrough';
332 readonly localKey: string;
333 readonly foreignKey: string;
334 readonly throughLocalKey: string;
335 readonly throughForeignKey: string;
336 /**
337 * Set related models as a relationship on the parent model
338 */
339 setRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel>[]): void;
340 /**
341 * Push related model(s) as a relationship on the parent model
342 */
343 pushRelated(parent: InstanceType<ParentModel>, related: InstanceType<RelatedModel> | InstanceType<RelatedModel>[]): void;
344 /**
345 * Set multiple related instances on the multiple parent models.
346 * This method is generally invoked during eager load.
347 */
348 setRelatedForMany(parent: InstanceType<ParentModel>[], related: InstanceType<RelatedModel>[]): void;
349 /**
350 * Returns the query client for a model instance
351 */
352 client(model: InstanceType<ParentModel>, client: QueryClientContract): RelationQueryClientContract<this, RelatedModel>;
353 }
354 /**
355 * A union of relationships
356 */
357 type RelationshipsContract = HasOneRelationContract<LucidModel, LucidModel> | HasManyRelationContract<LucidModel, LucidModel> | BelongsToRelationContract<LucidModel, LucidModel> | ManyToManyRelationContract<LucidModel, LucidModel> | HasManyThroughRelationContract<LucidModel, LucidModel>;
358 /**
359 * ------------------------------------------------------
360 * Relationships query client
361 * ------------------------------------------------------
362 */
363 interface RelationQueryClientContract<Relation extends RelationshipsContract, RelatedModel extends LucidModel> {
364 relation: Relation;
365 /**
366 * Return a query builder instance of the relationship
367 */
368 query<Result = InstanceType<RelatedModel>>(): RelationQueryBuilderContract<RelatedModel, Result>;
369 }
370 /**
371 * Query client for has one relationship
372 */
373 interface HasOneClientContract<Relation extends RelationshipsContract, RelatedModel extends LucidModel> extends RelationQueryClientContract<Relation, RelatedModel> {
374 /**
375 * Save related instance. Sets up the FK automatically
376 */
377 save(related: InstanceType<RelatedModel>): Promise<void>;
378 /**
379 * Create related instance. Sets up the FK automatically
380 */
381 create(values: Partial<ModelAttributes<InstanceType<RelatedModel>>>): Promise<InstanceType<RelatedModel>>;
382 /**
383 * Return first or create related instance
384 */
385 firstOrCreate(search: Partial<ModelAttributes<InstanceType<RelatedModel>>>, savePayload?: Partial<ModelAttributes<InstanceType<RelatedModel>>>): Promise<InstanceType<RelatedModel>>;
386 /**
387 * Update or create related instance
388 */
389 updateOrCreate(search: Partial<ModelAttributes<InstanceType<RelatedModel>>>, updatePayload: Partial<ModelAttributes<InstanceType<RelatedModel>>>): Promise<InstanceType<RelatedModel>>;
390 }
391 /**
392 * Query client for has many relationship. Extends hasOne and
393 * adds support for saving many relations
394 */
395 interface HasManyClientContract<Relation extends RelationshipsContract, RelatedModel extends LucidModel> extends HasOneClientContract<Relation, RelatedModel> {
396 /**
397 * Save many of related instances. Sets up FK automatically
398 */
399 saveMany(related: InstanceType<RelatedModel>[]): Promise<void>;
400 /**
401 * Create many of related instances. Sets up FK automatically
402 */
403 createMany(values: Partial<ModelAttributes<InstanceType<RelatedModel>>>[]): Promise<InstanceType<RelatedModel>[]>;
404 /**
405 * Fetch or create rows. Providers a great API to sync rows
406 */
407 fetchOrCreateMany(payload: Partial<ModelAttributes<InstanceType<RelatedModel>>>[], predicate?: keyof ModelAttributes<InstanceType<RelatedModel>> | (keyof ModelAttributes<InstanceType<RelatedModel>>)[]): Promise<InstanceType<RelatedModel>[]>;
408 /**
409 * Update or create rows. Providers a great API to sync rows
410 */
411 updateOrCreateMany(payload: Partial<ModelAttributes<InstanceType<RelatedModel>>>[], predicate?: keyof ModelAttributes<InstanceType<RelatedModel>> | (keyof ModelAttributes<InstanceType<RelatedModel>>)[]): Promise<InstanceType<RelatedModel>[]>;
412 /**
413 * Return a query builder instance of the relationship
414 */
415 query<Result = InstanceType<RelatedModel>>(): HasManyQueryBuilderContract<RelatedModel, Result>;
416 }
417 /**
418 * Query client for belongs to relationship. Uses `associate` and
419 * `dissociate` over save.
420 */
421 interface BelongsToClientContract<Relation extends RelationshipsContract, RelatedModel extends LucidModel> extends RelationQueryClientContract<Relation, RelatedModel> {
422 /**
423 * Associate related instance
424 */
425 associate(related: InstanceType<RelatedModel>): Promise<void>;
426 /**
427 * Dissociate related instance
428 */
429 dissociate(): Promise<void>;
430 }
431 /**
432 * Query client for many to many relationship.
433 */
434 interface ManyToManyClientContract<Relation extends RelationshipsContract, RelatedModel extends LucidModel> extends RelationQueryClientContract<Relation, RelatedModel> {
435 /**
436 * Returns related model query builder instance
437 */
438 query<Result = InstanceType<RelatedModel>>(): ManyToManyQueryBuilderContract<RelatedModel, Result>;
439 /**
440 * Pivot query just targets the pivot table without any joins
441 */
442 pivotQuery<Result = any>(): ManyToManyQueryBuilderContract<RelatedModel, Result>;
443 /**
444 * Save related model instance. Sets up FK automatically
445 */
446 save(related: InstanceType<RelatedModel>, performSync?: boolean, // defaults to true
447 pivotAttributes?: ModelObject): Promise<void>;
448 /**
449 * Save many of related model instance. Sets up FK automatically
450 */
451 saveMany(related: InstanceType<RelatedModel>[], performSync?: boolean, // defaults to true
452 pivotAttributes?: (ModelObject | undefined)[]): Promise<void>;
453 /**
454 * Create related model instance. Sets up FK automatically
455 */
456 create(values: Partial<ModelAttributes<InstanceType<RelatedModel>>>, pivotAttributes?: ModelObject): Promise<InstanceType<RelatedModel>>;
457 /**
458 * Create many of related model instances. Sets up FK automatically
459 */
460 createMany(values: Partial<ModelAttributes<InstanceType<RelatedModel>>>[], pivotAttributes?: (ModelObject | undefined)[]): Promise<InstanceType<RelatedModel>[]>;
461 /**
462 * Attach new pivot rows
463 */
464 attach(ids: (string | number)[] | Record<string, ModelObject>, trx?: TransactionClientContract): Promise<void>;
465 /**
466 * Detach existing pivot rows
467 */
468 detach(ids?: (string | number)[], trx?: TransactionClientContract): Promise<void>;
469 /**
470 * Sync pivot rows.
471 */
472 sync(ids: (string | number)[] | Record<string, ModelObject>, detach?: boolean, trx?: TransactionClientContract): Promise<void>;
473 }
474 /**
475 * HasMany through client contract. HasMany through doesn't
476 * allow persisting relationships. Use the direct relation
477 * for that.
478 */
479 interface HasManyThroughClientContract<Relation extends RelationshipsContract, RelatedModel extends LucidModel> extends RelationQueryClientContract<Relation, RelatedModel> {
480 /**
481 * Return a query builder instance of the relationship
482 */
483 query<Result = InstanceType<RelatedModel>>(): HasManyThroughQueryBuilderContract<RelatedModel, Result>;
484 }
485 /**
486 * ------------------------------------------------------
487 * Relationships query builders
488 * ------------------------------------------------------
489 */
490 /**
491 * Interface with query builder options for the many to many pivot
492 * table
493 */
494 interface PivotQueryBuilderContract {
495 pivotColumns(columns: string[]): this;
496 wherePivot: WherePivot<this>;
497 orWherePivot: WherePivot<this>;
498 andWherePivot: WherePivot<this>;
499 whereNotPivot: WherePivot<this>;
500 orWhereNotPivot: WherePivot<this>;
501 andWhereNotPivot: WherePivot<this>;
502 whereInPivot: WhereInPivot<this>;
503 orWhereInPivot: WhereInPivot<this>;
504 andWhereInPivot: WhereInPivot<this>;
505 whereNotInPivot: WhereInPivot<this>;
506 orWhereNotInPivot: WhereInPivot<this>;
507 andWhereNotInPivot: WhereInPivot<this>;
508 whereNullPivot: WhereNullPivot<this>;
509 orWhereNullPivot: WhereNullPivot<this>;
510 andWhereNullPivot: WhereNullPivot<this>;
511 whereNotNullPivot: WhereNullPivot<this>;
512 orWhereNotNullPivot: WhereNullPivot<this>;
513 andWhereNotNullPivot: WhereNullPivot<this>;
514 }
515 /**
516 * Base query builder for all relations
517 */
518 interface RelationQueryBuilderContract<Related extends LucidModel, Result> extends ModelQueryBuilderContract<Related, Result> {
519 /**
520 * Is query a relationship query obtained using `related('relation').query()`
521 */
522 isRelatedQuery: true;
523 /**
524 * Is query a relationship query obtained using `related('relation').subQuery()`
525 */
526 isRelatedSubQuery: false;
527 /**
528 * Is query a relationship query obtained using one of the preload methods.
529 */
530 isRelatedPreloadQuery: boolean;
531 selectRelationKeys(): this;
532 }
533 /**
534 * Has many query builder contract
535 */
536 interface HasManyQueryBuilderContract<Related extends LucidModel, Result> extends RelationQueryBuilderContract<Related, Result> {
537 groupLimit(limit: number): this;
538 groupOrderBy(column: string, direction?: 'asc' | 'desc'): this;
539 }
540 /**
541 * Has many query through builder contract
542 */
543 interface HasManyThroughQueryBuilderContract<Related extends LucidModel, Result> extends RelationQueryBuilderContract<Related, Result> {
544 groupLimit(limit: number): this;
545 groupOrderBy(column: string, direction?: 'asc' | 'desc'): this;
546 }
547 /**
548 * Possible signatures for adding a where clause
549 */
550 interface WherePivot<Builder> {
551 (key: string, value: StrictValues | ChainableContract): Builder;
552 (key: string, operator: string, value: StrictValues | ChainableContract): Builder;
553 }
554 /**
555 * Possible signatures for adding whereNull clause.
556 */
557 interface WhereNullPivot<Builder> {
558 (key: string): Builder;
559 }
560 /**
561 * Possible signatures for adding where in clause.
562 */
563 interface WhereInPivot<Builder> {
564 (K: string, value: StrictValues[]): Builder;
565 (K: string[], value: StrictValues[][]): Builder;
566 (k: string, subquery: ChainableContract | QueryCallback<Builder> | RawBuilderContract | RawQuery): Builder;
567 (k: string[], subquery: ChainableContract | RawBuilderContract | RawQuery): Builder;
568 }
569 /**
570 * Shape of many to many query builder. It has few methods over the standard
571 * model query builder
572 */
573 interface ManyToManyQueryBuilderContract<Related extends LucidModel, Result> extends RelationQueryBuilderContract<Related, Result>, PivotQueryBuilderContract {
574 isPivotOnlyQuery: boolean;
575 groupLimit(limit: number): this;
576 groupOrderBy(column: string, direction?: 'asc' | 'desc'): this;
577 }
578 /**
579 * ------------------------------------------------------
580 * Sub Queries
581 * ------------------------------------------------------
582 */
583 /**
584 * Not in use right now. Since after omitting these types from the
585 * model query builder losses "this" scope. Need to re-think
586 */
587 type UnSupportedSubQueryMethods = 'preload' | 'decrement' | 'increment' | 'update' | 'paginate' | 'delete' | 'del' | 'firstOrFail' | 'first' | 'exec' | 'withCount';
588 /**
589 * SubQuery builder allows creating sub queries targeting a relationship. Sub queries
590 * cannot be executed directly, but can be used as a reference in the parent query
591 * builder. Use cases are:
592 *
593 * - withCount
594 * - whereHas
595 */
596 interface RelationSubQueryBuilderContract<Related extends LucidModel> extends ModelQueryBuilderContract<Related, any> {
597 /**
598 * Is query a relationship query obtained using `related('relation').query()`
599 */
600 isRelatedQuery: false;
601 /**
602 * Is query a relationship query obtained using `related('relation').subQuery()`
603 */
604 isRelatedSubQuery: true;
605 /**
606 * Is query a relationship query obtained using one of the preload methods.
607 */
608 isRelatedPreloadQuery: false;
609 selfJoinCounter: number;
610 readonly selfJoinAlias: string;
611 selectRelationKeys(): this;
612 prepare(): this;
613 }
614 /**
615 * SubQuery builder for many to many relationship
616 */
617 interface ManyToManySubQueryBuilderContract<Related extends LucidModel> extends RelationSubQueryBuilderContract<Related>, PivotQueryBuilderContract {
618 }
619 /**
620 * The withCount function
621 */
622 interface WithCount<Model extends LucidRow, Builder> {
623 <Name extends ExtractModelRelations<Model>, RelatedBuilder = Model[Name] extends ModelRelations ? Model[Name]['subQuery'] : never>(relation: Name, callback?: (builder: RelatedBuilder) => void): Builder;
624 }
625 /**
626 * The with aggregate function
627 */
628 interface WithAggregate<Model extends LucidRow, Builder> {
629 <Name extends ExtractModelRelations<Model>, RelatedBuilder = Model[Name] extends ModelRelations ? Model[Name]['subQuery'] : never>(relation: Name, callback: (builder: RelatedBuilder) => void): Builder;
630 }
631 /**
632 * The has function
633 */
634 interface Has<Model extends LucidRow, Builder> {
635 <Name extends ExtractModelRelations<Model>>(relation: Name, operator?: string, value?: StrictValues | ChainableContract): Builder;
636 }
637 /**
638 * The whereHas function
639 */
640 interface WhereHas<Model extends LucidRow, Builder> {
641 <Name extends ExtractModelRelations<Model>, RelatedBuilder = Model[Name] extends ModelRelations ? Model[Name]['subQuery'] : never>(relation: Name, callback: (builder: RelatedBuilder) => void, operator?: string, value?: StrictValues | ChainableContract): Builder;
642 }
643 /**
644 * ------------------------------------------------------
645 * Preloader
646 * ------------------------------------------------------
647 */
648 /**
649 * The preload function
650 */
651 interface Preload<Model extends LucidRow, Builder> {
652 <Name extends ExtractModelRelations<Model>, RelatedBuilder = Model[Name] extends ModelRelations ? Model[Name]['builder'] : never>(relation: Name, callback?: (builder: RelatedBuilder) => void): Builder;
653 }
654 /**
655 * Shape of the preloader to preload relationships
656 */
657 interface PreloaderContract<Model extends LucidRow> {
658 processAllForOne(parent: Model, client: QueryClientContract): Promise<void>;
659 processAllForMany(parent: Model[], client: QueryClientContract): Promise<void>;
660 load: Preload<Model, this>;
661 preload: Preload<Model, this>;
662 debug(debug: boolean): this;
663 sideload(values: ModelObject): this;
664 }
665}
666
\No newline at end of file