or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

expression-builders.mdgraph-operations.mdindex.mdmodel-definition.mdquery-building.mdrelationships.mdtransactions.mdutilities.mdvalidation.md

query-building.mddocs/

0

# Query Building

1

2

Advanced query building with chainable methods, joins, aggregates, and complex WHERE conditions.

3

4

## Capabilities

5

6

### QueryBuilderBase Class

7

8

Base class providing core query building functionality and transaction support.

9

10

```javascript { .api }

11

/**

12

* Base QueryBuilder class providing core functionality

13

*/

14

class QueryBuilderBase {

15

/**

16

* Modify the query using a function or named modifier

17

* @param func - Modifier function or name

18

* @param args - Additional arguments for the modifier

19

* @returns QueryBuilderBase instance

20

*/

21

modify(func: string | Function, ...args: any[]): QueryBuilderBase;

22

23

/**

24

* Set transaction context for the query

25

* @param trx - Knex transaction object or null

26

* @returns QueryBuilderBase instance

27

*/

28

transacting(trx: Transaction | null): QueryBuilderBase;

29

30

/**

31

* Clone the query builder

32

* @returns New QueryBuilderBase instance

33

*/

34

clone(): QueryBuilderBase;

35

36

/**

37

* Get the Knex query builder instance

38

* @returns Knex QueryBuilder

39

*/

40

knex(): Knex;

41

42

/**

43

* Convert to Knex query

44

* @returns Knex QueryBuilder

45

*/

46

toKnexQuery(): Knex.QueryBuilder;

47

48

/**

49

* Set query context

50

* @param context - Context object

51

* @returns QueryBuilderBase instance

52

*/

53

context(context: object): QueryBuilderBase;

54

55

/**

56

* Clear query context

57

* @returns QueryBuilderBase instance

58

*/

59

clearContext(): QueryBuilderBase;

60

61

/**

62

* Enable query debugging

63

* @returns QueryBuilderBase instance

64

*/

65

debug(): QueryBuilderBase;

66

}

67

```

68

69

### QueryBuilderOperation Class

70

71

Base class for query operations that modify the query builder.

72

73

```javascript { .api }

74

/**

75

* Base class for all query builder operations

76

*/

77

class QueryBuilderOperation {

78

/**

79

* Operation name

80

*/

81

readonly name: string;

82

83

/**

84

* Operation constructor

85

* @param name - Operation name

86

* @param opt - Operation options

87

*/

88

constructor(name: string, opt?: any);

89

90

/**

91

* Check if operation is a subclass of another operation

92

* @param OperationClass - Operation class to check against

93

* @returns boolean

94

*/

95

is(OperationClass: Function): boolean;

96

97

/**

98

* Called when operation is added to query

99

* @param builder - Query builder instance

100

* @param args - Operation arguments

101

* @returns QueryBuilderOperation instance

102

*/

103

onAdd(builder: QueryBuilderBase, args: any[]): QueryBuilderOperation;

104

105

/**

106

* Called before build phase

107

* @param builder - Query builder instance

108

* @returns QueryBuilderOperation instance or Promise

109

*/

110

onBefore1(builder: QueryBuilderBase): QueryBuilderOperation | Promise<QueryBuilderOperation>;

111

112

/**

113

* Called during build phase

114

* @param builder - Query builder instance

115

* @returns QueryBuilderOperation instance or Promise

116

*/

117

onBuild(builder: QueryBuilderBase): QueryBuilderOperation | Promise<QueryBuilderOperation>;

118

119

/**

120

* Check if operation can be skipped

121

* @param builder - Query builder instance

122

* @returns boolean

123

*/

124

hasOnBuild(builder: QueryBuilderBase): boolean;

125

126

/**

127

* Clone the operation

128

* @param props - Properties to override

129

* @returns New QueryBuilderOperation instance

130

*/

131

clone(props?: object): QueryBuilderOperation;

132

}

133

```

134

135

### QueryBuilder Class

136

137

Main query builder class providing chainable query methods for database operations.

138

139

```javascript { .api }

140

/**

141

* Main QueryBuilder class for constructing database queries

142

*/

143

class QueryBuilder {

144

// Selection methods

145

select(...columns: string[]): QueryBuilder;

146

distinct(...columns: string[]): QueryBuilder;

147

148

// FROM clause

149

from(table: string | QueryBuilder): QueryBuilder;

150

151

// WHERE conditions

152

where(column: string, operator: string, value: any): QueryBuilder;

153

where(column: string, value: any): QueryBuilder;

154

where(object: object): QueryBuilder;

155

where(callback: (builder: QueryBuilder) => void): QueryBuilder;

156

157

orWhere(column: string, operator: string, value: any): QueryBuilder;

158

whereNot(column: string, operator: string, value: any): QueryBuilder;

159

whereIn(column: string, values: any[]): QueryBuilder;

160

whereNotIn(column: string, values: any[]): QueryBuilder;

161

whereNull(column: string): QueryBuilder;

162

whereNotNull(column: string): QueryBuilder;

163

whereBetween(column: string, range: [any, any]): QueryBuilder;

164

whereExists(callback: (builder: QueryBuilder) => void): QueryBuilder;

165

166

// Raw WHERE

167

whereRaw(sql: string, ...bindings: any[]): QueryBuilder;

168

orWhereRaw(sql: string, ...bindings: any[]): QueryBuilder;

169

170

// JSON operations

171

whereJsonObject(column: string, value: any): QueryBuilder;

172

whereJsonPath(column: string, path: string, operator: string, value: any): QueryBuilder;

173

whereJsonSupersetOf(column: string, value: any): QueryBuilder;

174

whereJsonSubsetOf(column: string, value: any): QueryBuilder;

175

176

// JOINS

177

join(table: string, leftCol: string, rightCol: string): QueryBuilder;

178

join(table: string, callback: (builder: JoinClause) => void): QueryBuilder;

179

leftJoin(table: string, leftCol: string, rightCol: string): QueryBuilder;

180

rightJoin(table: string, leftCol: string, rightCol: string): QueryBuilder;

181

innerJoin(table: string, leftCol: string, rightCol: string): QueryBuilder;

182

fullOuterJoin(table: string, leftCol: string, rightCol: string): QueryBuilder;

183

184

// Relation joins

185

joinRelated(expression: string, options?: JoinRelatedOptions): QueryBuilder;

186

leftJoinRelated(expression: string, options?: JoinRelatedOptions): QueryBuilder;

187

188

// ORDER BY

189

orderBy(column: string, direction?: 'asc' | 'desc'): QueryBuilder;

190

orderBy(columns: OrderByDescriptor[]): QueryBuilder;

191

orderByRaw(sql: string, ...bindings: any[]): QueryBuilder;

192

193

// GROUP BY

194

groupBy(...columns: string[]): QueryBuilder;

195

groupByRaw(sql: string, ...bindings: any[]): QueryBuilder;

196

197

// HAVING

198

having(column: string, operator: string, value: any): QueryBuilder;

199

havingRaw(sql: string, ...bindings: any[]): QueryBuilder;

200

201

// Aggregates

202

count(column?: string): QueryBuilder;

203

sum(column: string): QueryBuilder;

204

avg(column: string): QueryBuilder;

205

min(column: string): QueryBuilder;

206

max(column: string): QueryBuilder;

207

208

// Pagination

209

limit(count: number): QueryBuilder;

210

offset(count: number): QueryBuilder;

211

page(page: number, pageSize: number): QueryBuilder;

212

range(start?: number, end?: number): QueryBuilder;

213

214

// CRUD operations

215

insert(data: object | object[]): QueryBuilder;

216

insertAndFetch(data: object | object[]): QueryBuilder;

217

update(data: object): QueryBuilder;

218

updateAndFetch(data: object): QueryBuilder;

219

patch(data: object): QueryBuilder;

220

patchAndFetch(data: object): QueryBuilder;

221

delete(): QueryBuilder;

222

del(): QueryBuilder;

223

224

// Upsert operations

225

onConflict(column?: string | string[]): QueryBuilder;

226

merge(data?: object | string[]): QueryBuilder;

227

ignore(): QueryBuilder;

228

229

// Relations

230

withGraphFetched(expression: string, options?: GraphOptions): QueryBuilder;

231

withGraphJoined(expression: string, options?: GraphOptions): QueryBuilder;

232

233

// Finders

234

findById(id: any): QueryBuilder;

235

findByIds(ids: any[]): QueryBuilder;

236

findOne(...args: any[]): QueryBuilder;

237

238

// Query execution

239

execute(): Promise<any>;

240

then(onFulfilled?: Function, onRejected?: Function): Promise<any>;

241

242

// Query introspection

243

isFind(): boolean;

244

isInsert(): boolean;

245

isUpdate(): boolean;

246

isDelete(): boolean;

247

248

// Query modification

249

modify(modifier: string | Function, ...args: any[]): QueryBuilder;

250

modifiers(modifiers: object): QueryBuilder;

251

252

// Context

253

context(context: object): QueryBuilder;

254

clearContext(): QueryBuilder;

255

256

// Utilities

257

clone(): QueryBuilder;

258

debug(): QueryBuilder;

259

timeout(ms: number): QueryBuilder;

260

returning(columns: string | string[]): QueryBuilder;

261

262

// Knex integration

263

toKnexQuery(): Knex.QueryBuilder;

264

knex(): Knex;

265

}

266

```

267

268

**Usage Examples:**

269

270

```javascript

271

const { Model } = require('objection');

272

273

// Basic SELECT query

274

const people = await Person.query()

275

.select('firstName', 'lastName', 'age')

276

.where('age', '>', 18)

277

.orderBy('lastName');

278

279

// Complex WHERE conditions

280

const results = await Person.query()

281

.where('age', '>=', 18)

282

.where('active', true)

283

.orWhere(builder => {

284

builder.where('vip', true).where('age', '>=', 16);

285

})

286

.whereIn('category', ['premium', 'gold'])

287

.whereNotNull('email');

288

289

// JOIN queries

290

const peopleWithPets = await Person.query()

291

.join('pets', 'persons.id', 'pets.ownerId')

292

.select('persons.*', 'pets.name as petName')

293

.where('pets.species', 'dog');

294

295

// Aggregation

296

const stats = await Person.query()

297

.groupBy('department')

298

.select('department')

299

.count('id as personCount')

300

.avg('age as averageAge')

301

.having('personCount', '>', 5);

302

```

303

304

### Selection Methods

305

306

Methods for specifying which columns to select.

307

308

```javascript { .api }

309

/**

310

* Select specific columns

311

* @param columns - Column names to select

312

* @returns QueryBuilder instance

313

*/

314

select(...columns: string[]): QueryBuilder;

315

316

/**

317

* Select distinct values

318

* @param columns - Column names for distinct selection

319

* @returns QueryBuilder instance

320

*/

321

distinct(...columns: string[]): QueryBuilder;

322

323

/**

324

* Add columns to existing selection

325

* @param columns - Additional column names

326

* @returns QueryBuilder instance

327

*/

328

columns(...columns: string[]): QueryBuilder;

329

```

330

331

### WHERE Conditions

332

333

Methods for adding WHERE conditions to queries.

334

335

```javascript { .api }

336

/**

337

* Add WHERE condition

338

* @param column - Column name or object with conditions

339

* @param operator - Comparison operator

340

* @param value - Value to compare against

341

* @returns QueryBuilder instance

342

*/

343

where(column: string, operator: string, value: any): QueryBuilder;

344

where(column: string, value: any): QueryBuilder;

345

where(conditions: object): QueryBuilder;

346

347

/**

348

* Add OR WHERE condition

349

*/

350

orWhere(column: string, operator: string, value: any): QueryBuilder;

351

352

/**

353

* Add WHERE NOT condition

354

*/

355

whereNot(column: string, operator: string, value: any): QueryBuilder;

356

357

/**

358

* Add WHERE IN condition

359

*/

360

whereIn(column: string, values: any[]): QueryBuilder;

361

362

/**

363

* Add WHERE NULL condition

364

*/

365

whereNull(column: string): QueryBuilder;

366

367

/**

368

* Add WHERE BETWEEN condition

369

*/

370

whereBetween(column: string, range: [any, any]): QueryBuilder;

371

372

/**

373

* Add raw WHERE condition

374

*/

375

whereRaw(sql: string, ...bindings: any[]): QueryBuilder;

376

```

377

378

### JOIN Operations

379

380

Methods for joining tables.

381

382

```javascript { .api }

383

/**

384

* Add INNER JOIN

385

* @param table - Table to join

386

* @param leftCol - Left column for join condition

387

* @param rightCol - Right column for join condition

388

* @returns QueryBuilder instance

389

*/

390

join(table: string, leftCol: string, rightCol: string): QueryBuilder;

391

392

/**

393

* Add LEFT JOIN

394

*/

395

leftJoin(table: string, leftCol: string, rightCol: string): QueryBuilder;

396

397

/**

398

* Add RIGHT JOIN

399

*/

400

rightJoin(table: string, leftCol: string, rightCol: string): QueryBuilder;

401

402

/**

403

* Join related models through relationship definitions

404

* @param expression - Relation expression string

405

* @param options - Join options

406

* @returns QueryBuilder instance

407

*/

408

joinRelated(expression: string, options?: JoinRelatedOptions): QueryBuilder;

409

```

410

411

### CRUD Operations

412

413

Methods for inserting, updating, and deleting data.

414

415

```javascript { .api }

416

/**

417

* Insert new records

418

* @param data - Data to insert (object or array of objects)

419

* @returns QueryBuilder instance

420

*/

421

insert(data: object | object[]): QueryBuilder;

422

423

/**

424

* Insert and return the inserted records

425

* @param data - Data to insert

426

* @returns QueryBuilder instance

427

*/

428

insertAndFetch(data: object | object[]): QueryBuilder;

429

430

/**

431

* Update existing records

432

* @param data - Data to update

433

* @returns QueryBuilder instance

434

*/

435

update(data: object): QueryBuilder;

436

437

/**

438

* Update and return the updated records

439

* @param data - Data to update

440

* @returns QueryBuilder instance

441

*/

442

updateAndFetch(data: object): QueryBuilder;

443

444

/**

445

* Patch (partial update) existing records

446

* @param data - Data to patch

447

* @returns QueryBuilder instance

448

*/

449

patch(data: object): QueryBuilder;

450

451

/**

452

* Delete records

453

* @returns QueryBuilder instance

454

*/

455

delete(): QueryBuilder;

456

```

457

458

### Aggregation Methods

459

460

Methods for aggregate functions.

461

462

```javascript { .api }

463

/**

464

* Count records

465

* @param column - Column to count (default: '*')

466

* @returns QueryBuilder instance

467

*/

468

count(column?: string): QueryBuilder;

469

470

/**

471

* Sum column values

472

* @param column - Column to sum

473

* @returns QueryBuilder instance

474

*/

475

sum(column: string): QueryBuilder;

476

477

/**

478

* Average column values

479

* @param column - Column to average

480

* @returns QueryBuilder instance

481

*/

482

avg(column: string): QueryBuilder;

483

484

/**

485

* Minimum column value

486

* @param column - Column to find minimum

487

* @returns QueryBuilder instance

488

*/

489

min(column: string): QueryBuilder;

490

491

/**

492

* Maximum column value

493

* @param column - Column to find maximum

494

* @returns QueryBuilder instance

495

*/

496

max(column: string): QueryBuilder;

497

```

498

499

## Types

500

501

```typescript { .api }

502

interface JoinRelatedOptions {

503

alias?: string | boolean;

504

aliases?: Record<string, string>;

505

}

506

507

interface OrderByDescriptor {

508

column: string;

509

order?: 'asc' | 'desc';

510

}

511

512

interface GraphOptions {

513

minimize?: boolean;

514

separator?: string;

515

aliases?: Record<string, string>;

516

joinOperation?: string;

517

maxBatchSize?: number;

518

}

519

520

interface JoinClause {

521

on(leftCol: string, rightCol: string): JoinClause;

522

onIn(leftCol: string, values: any[]): JoinClause;

523

onNull(column: string): JoinClause;

524

onNotNull(column: string): JoinClause;

525

using(columns: string[]): JoinClause;

526

}

527

```