If tutorials available on this website are helpful for you, please whitelist this website in your ad blocker😭 or Donate to help us ❤️ pay for the web hosting to keep the website running.
NestJS में MySQL के साथ Query Builder का use आपको TypeORM
के through complex SQL queries को लिखने का flexible और powerful तरीका देता है।
जब आपको advanced queries (like joins, filtering, pagination, aggregation) perform करनी हो और raw SQL query लिखना avoid करना हो, तब Query Builder एक perfect solution होता है।
Query Builder आपको TypeORM entities
के साथ object-oriented तरीके से complex SQL queries लिखने कि flexibility provide करता है।
इस topic में हम Query Builder का detailed overview देखेंगे, उसके common methods और उनके examples को समझेंगे, जो NestJS के MySQL integration के साथ काम आते हैं।
Query Builder एक feature है जो TypeORM आपको देता है ताकि आप object-oriented
तरीके से complex SQL queries लिख सकें। आपको raw SQL query लिखने कि need नहीं पड़ती, और आप multiple clauses (like SELECT, WHERE, JOIN, etc.) को easily chain कर सकते हैं।
Query Builder को use करने का main advantage यह है कि आप TypeScript के typing के साथ सारी SQL
queries को लिख सकते हैं और अपने code को clean और maintainable बना सकते हैं।
●●●
Query Builder में कुछ important methods होते हैं जो आपको SQL queries build करने में help करते हैं। ये methods आपको SELECT, WHERE, JOIN, ORDER BY, और LIMIT जैसे clauses को easily implement करने कि सुविधा देते हैं।
createQueryBuilder() : यह method query builder create करने के लिए use होता है।
select() : Table के specific columns को select करने के लिए use होता है।
where() : Filtering conditions लगाने के लिए।
innerJoinAndSelect() / leftJoinAndSelect() : Tables के बीच joins बनाने के लिए।
orderBy() : Sorting के लिए use होता है।
limit() और offset() : Pagination implement करने के लिए।
चलिए इन methods को detail में समझते हैं और examples के साथ देखते हैं।
पहले एक User
entity बनाते हैं जो MySQL table को represent करेगी।
File : src/user/user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
@Column()
age: number;
}
●●●
सबसे basic query जो हम perform करते हैं वो है select query. select()
method का use करते hue हम specific columns को select कर सकते हैं।
हम UserService
में Query Builder का use करके एक basic SELECT
query लिखते हैं।
File : src/user/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
async findAllUsers(): Promise<User[]> {
return this.userRepository
.createQueryBuilder('user')
.select(['user.id', 'user.name', 'user.email'])
.getMany(); // Yeh query sabhi users ko select karegi
}
}
यहां
createQueryBuilder('user')
method का use करके query builder create किया गया है और 'user
' table को alias दिया गया है।
select()
method का use करके हम specific columns (id, name, email) को select कर रहे हैं।
getMany()
method का use कर के सभी matching records को retrieve किया गया है।
●●●
अब अगर हमें specific conditions के साथ records को filter करना हो, तो हम where()
method का use करते हैं। यह method SQL के WHERE clause को represent करता है।
File : src/user/user.service.ts
async findUsersByAge(minAge: number): Promise<User[]> {
return this.userRepository
.createQueryBuilder('user')
.where('user.age > :minAge', { minAge }) // Age filter apply kiya gaya hai
.getMany();
}
Example में :minAge
इस a placeholder, जो parameters object से value लेता है।
●●●
अगर आपको multiple tables को join करना हो, तो innerJoinAndSelect()
या leftJoinAndSelect()
का use करके आप SQL JOIN queries लिख सकते हैं।
यहां हम User और Profile tables को join करेंगे। पहले Profile entity बनाते हैं और User के साथ relationship define करते हैं।
File : src/profile/profile.entity.ts
import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn } from 'typeorm';
import { User } from '../user/user.entity';
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
bio: string;
@OneToOne(() => User)
@JoinColumn()
user: User;
}
File : src/user/user.service.ts
async findUsersWithProfile(): Promise<User[]> {
return this.userRepository
.createQueryBuilder('user')
.innerJoinAndSelect('user.profile', 'profile') // Join profile with user
.getMany();
}
example में innerJoinAndSelect()
का use करके हम user और profile tables को join कर रहे हैं और उनके corresponding records को select कर रहे हैं।
●●●
Sorting के लिए orderBy()
method का use किया जाता है। इससे आप records को ascending या descending order में arrange कर सकते हैं।
File : src/user/user.service.ts
async findAllUsersSorted(): Promise<User[]> {
return this.userRepository
.createQueryBuilder('user')
.orderBy('user.name', 'ASC') // Name ke hisaab se sorting ASC order mein
.getMany();
}
●●●
अगर आपको large datasets handle करने हैं, तो pagination का use करके आप queries को efficient बना सकते हैं। इसमें limit()
और offset()
का use होता है जो SQL queries में LIMIT और OFFSET को represent करता है।
File : src/user/user.service.ts
async findUsersWithPagination(limit: number, offset: number): Promise<User[]> {
return this.userRepository
.createQueryBuilder('user')
.limit(limit) // Limit kitne records fetch karne hain
.offset(offset) // Offset starting point define karta hai
.getMany();
}
●●●
NestJs MySQL Aggregation Functions
SQL aggregation functions जैसे COUNT(), SUM(), या AVG() को भी आप Query Builder के through implement कर सकते हैं।
File : src/user/user.service.ts
async countUsers(): Promise<number> {
return this.userRepository
.createQueryBuilder('user')
.select('COUNT(user.id)', 'count') // COUNT() function ka use
.getRawOne()
.then(result => result.count);
}
यहां
select('COUNT(user.id)', 'count')
का use करके हम user records count कर रहे हैं।
getRawOne()
method का use करके raw result को fetch किया गया है।
●●●
Use Query Builder for Complex Queries : Query Builder का use तब करें जब आपको complex joins, filtering, या aggregation करना हो। Basic CRUD operations के लिए repositories को directly use करना better होता है।
Handle SQL Injection : Query Builder में parameterized queries का use करें ताकि SQL injection से बचा जा सके।
Use DTOs for Data Validation : जब आप client से input ले रहे हैं, तो data validation के लिए DTOs
का use करें। इससे input data sanitized रहेगा।
Pagination for Large Datasets : Large datasets के लिए pagination implement करना performance और efficiency के लिए जरूरी होता है।
Avoid Overuse of Query Builder : हमेशा Query Builder का use न करें। अगर query simple है, तो repository methods like find(), findOne() का use करें।