TypeORM এবং Custom Repository
TypeORM একটি ORM (Object-Relational Mapping) লাইব্রেরি, যা ডেটাবেসের টেবিলগুলোকে TypeScript ক্লাসের মাধ্যমে প্রতিনিধিত্ব করতে সাহায্য করে। TypeORM ডিফল্টরূপে Repository প্যাটার্ন ব্যবহার করে ডেটাবেসের সৃষ্ট, পড়া, আপডেট এবং মুছে ফেলা (CRUD) অপারেশনগুলো পরিচালনা করে।
ডিফল্ট রেপোজিটরি সাধারণত শুধু প্রাথমিক CRUD অপারেশনগুলি (যেমন find, save, remove) পরিচালনা করে। তবে, কখনও কখনও আপনাকে কাস্টম লজিক বা জটিল কুয়েরি প্রয়োগ করতে হয়। এর জন্য Custom Repository ব্যবহার করা হয়।
TypeORM এ Custom Repository একটি কাস্টম ক্লাস তৈরি করার মাধ্যমে আপনি ডেটাবেস অপারেশনগুলি পরিচালনা করতে পারেন, যেখানে আপনার নির্দিষ্ট প্রয়োজনীয় লজিক থাকবে।
Custom Repository তৈরি করার পদক্ষেপ
১. Repository ক্লাস তৈরি করা
প্রথমে আপনাকে একটি Custom Repository ক্লাস তৈরি করতে হবে যা Repository ক্লাসটি extends (বৃদ্ধি) করবে। এই ক্লাসে আপনি আপনার কাস্টম লজিক এবং কুয়েরি মেথড যুক্ত করতে পারেন।
Custom Repository তৈরি করার উদাহরণ:
ধরা যাক, আমাদের একটি User টেবিল রয়েছে এবং আমরা findUsersByAge নামে একটি কাস্টম মেথড তৈরি করতে চাই, যা একটি নির্দিষ্ট বয়সের উপরে সকল ইউজারদের রিটার্ন করবে।
User Entity (এন্টিটি) তৈরি:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
age: number;
@Column()
email: string;
}
এটি আমাদের User এন্টিটি (টেবিল) যা id, name, age এবং email কলাম নিয়ে গঠিত।
২. Custom Repository ক্লাস তৈরি
UserRepository.ts (Custom Repository):
import { EntityRepository, Repository } from 'typeorm';
import { User } from './User';
@EntityRepository(User)
export class UserRepository extends Repository<User> {
// কাস্টম মেথড যা একটি নির্দিষ্ট বয়সের উপরে ইউজারদের খুঁজে বের করবে
async findUsersByAge(age: number): Promise<User[]> {
return this.createQueryBuilder("user")
.where("user.age > :age", { age })
.getMany(); // SQL Query: SELECT * FROM user WHERE age > :age
}
// অন্যান্য কাস্টম মেথড যেমন ইউজার অনুসন্ধান বা ফিল্টারিং করা
async findUserByEmail(email: string): Promise<User | undefined> {
return this.findOne({ where: { email } });
}
}
এখানে, UserRepository ক্লাসটি Repository<User> কে extends (বৃদ্ধি) করেছে এবং দুইটি কাস্টম মেথড তৈরি করেছে:
findUsersByAge(age: number): এই মেথডটি একটি নির্দিষ্ট বয়সের উপরে থাকা সকল ইউজারদের রিটার্ন করবে।findUserByEmail(email: string): এই মেথডটি একটি নির্দিষ্ট ইমেইল অনুসারে ইউজার খুঁজে বের করবে।
৩. Custom Repository ব্যবহার করা
Custom Repository ব্যবহার করতে, আপনাকে DataSource এর মাধ্যমে UserRepository ইনজেক্ট করতে হবে। TypeORM Custom Repository ব্যবহার করার জন্য আপনাকে getCustomRepository() ব্যবহার করতে হবে।
App.ts (ডেটাবেসের সাথে সংযোগ এবং কাস্টম রেপোজিটরি ব্যবহার):
import 'reflect-metadata';
import { DataSource } from 'typeorm';
import { User } from './entity/User';
import { UserRepository } from './repository/UserRepository';
// ডেটাবেস সংযোগ কনফিগারেশন
const AppDataSource = new DataSource({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'yourpassword',
database: 'testdb',
entities: [User],
synchronize: true,
logging: true,
});
// ডেটাবেস সংযোগ স্থাপন
AppDataSource.initialize()
.then(async () => {
console.log('Data Source has been initialized!');
// Custom Repository ব্যবহার
const userRepository = AppDataSource.getRepository(UserRepository);
// কাস্টম মেথড ব্যবহার
const usersAbove30 = await userRepository.findUsersByAge(30);
console.log(usersAbove30);
const user = await userRepository.findUserByEmail('john.doe@example.com');
console.log(user);
})
.catch((error) => {
console.error('Error during Data Source initialization:', error);
});
এখানে, আমরা AppDataSource.getRepository(UserRepository) এর মাধ্যমে UserRepository ইনস্ট্যান্স পেয়েছি এবং কাস্টম মেথডগুলি ব্যবহার করেছি।
সারাংশ
Custom Repository TypeORM এ এমন একটি বৈশিষ্ট্য যা ডেভেলপারদের তাদের নির্দিষ্ট প্রয়োজন অনুযায়ী কাস্টম লজিক এবং কুয়েরি ফাংশন তৈরি করতে সাহায্য করে। এই কাস্টম রেপোজিটরিগুলি ডিফল্ট রেপোজিটরি ফাংশনগুলির পরিপূরক হিসেবে ব্যবহৃত হয়, যেখানে আপনি আরও জটিল এবং ডায়নামিক ডেটাবেস অপারেশন করতে পারেন। TypeORM এর @EntityRepository() ডেকোরেটর এবং Repository ক্লাসের মাধ্যমে কাস্টম রেপোজিটরি তৈরি করা সম্ভব।
এই কাস্টম রেপোজিটরি আপনার প্রজেক্টের স্কেল এবং কার্যকারিতা বৃদ্ধি করতে পারে এবং ডেটাবেস কোডিংকে আরও পুনঃব্যবহারযোগ্য ও কার্যকরী করে তুলতে সাহায্য করে।