Repository এবং Data Access

টাইপওআরএম (TypeORM) - Web Development

318

TypeORM Repository এবং Data Access: একটি পরিচিতি

TypeORM হলো একটি ORM (Object-Relational Mapper) যা ডাটাবেসের সাথে কাজ করার জন্য ব্যবহৃত হয়। এটি ডাটাবেস টেবিলগুলিকে জাভাস্ক্রিপ্ট অবজেক্টের সাথে ম্যাপ করে এবং SQL কোড লেখার প্রয়োজন ছাড়াই ডাটাবেসের সাথে যোগাযোগ করতে সাহায্য করে। Repository হচ্ছে TypeORM এর একটি শক্তিশালী বৈশিষ্ট্য যা ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন সহজে পরিচালনা করতে সহায়তা করে।

এই গাইডে আমরা Repository Pattern এবং Data Access সম্পর্কে আলোচনা করব, যেগুলি TypeORM-এ ডাটাবেসের সাথে ডেটা পরিচালনা করার জন্য ব্যবহৃত হয়।


Repository Pattern: TypeORM এর মধ্যে

Repository Pattern একটি ডিজাইন প্যাটার্ন যা ডাটাবেসের সাথে যোগাযোগের জন্য একটি বিশেষ অবজেক্ট বা ক্লাস তৈরি করে। এটি ডেটাবেসের সাথে সরাসরি ইন্টারঅ্যাকশন থেকে অ্যাপ্লিকেশন লজিককে আলাদা করে, ফলে কোডের রিইউসেবিলিটি এবং স্কেলেবিলিটি বাড়ে।

TypeORM-এ Repository এমন একটি অবজেক্ট যা একটি Entity-এর সাথে সম্পর্কিত ডেটাবেস অপারেশন পরিচালনা করে। এটি ডেটাবেসে টেবিলের সাথে কাজ করার জন্য ব্যবহৃত হয় এবং CRUD অপারেশনগুলো খুবই সহজভাবে পরিচালনা করা যায়।

Repository এর মূল বৈশিষ্ট্য:

  • CRUD অপারেশন: ডেটা তৈরি, পড়া, আপডেট, মুছে ফেলা।
  • Custom Queries: কাস্টম SQL বা TypeORM কুয়েরি তৈরি করা।
  • টেবিলের সাথে সম্পর্কিত সব ফাংশন: একটি Entity থেকে ডেটা রিটার্ন বা অপারেশন করতে ব্যবহৃত হয়।

TypeORM-এ Repository তৈরি এবং ব্যবহার

১. Entity তৈরি করা

প্রথমে একটি Entity তৈরি করতে হবে, যা ডাটাবেস টেবিলের প্রতিনিধিত্ব করবে।

উদাহরণ:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

এখানে, User একটি Entity, যার মধ্যে id, name, এবং email কলাম রয়েছে।

২. Repository ব্যবহার করা

TypeORM-এ Repository ব্যবহারের জন্য, প্রথমে getRepository() মেথড ব্যবহার করে রেপোজিটরি পান এবং তারপর বিভিন্ন ডেটাবেস অপারেশন যেমন save(), find(), update(), ইত্যাদি ব্যবহার করুন।

প্রথম CRUD অপারেশন (Save, Read):

import "reflect-metadata";
import { createConnection } from "typeorm";
import { User } from "./entity/User";

createConnection().then(async connection => {
  console.log("Connected to the database!");

  const userRepository = connection.getRepository(User);

  // নতুন ব্যবহারকারী তৈরি করা
  const user = new User();
  user.name = "John Doe";
  user.email = "john.doe@example.com";
  await userRepository.save(user);

  // ডাটাবেস থেকে ব্যবহারকারী পাওয়া
  const users = await userRepository.find();
  console.log(users);
}).catch(error => console.log(error));

এখানে, userRepository.save() নতুন ব্যবহারকারী ডাটাবেসে সেভ করছে এবং userRepository.find() সমস্ত ব্যবহারকারী রিটার্ন করছে।

৩. কাস্টম কুয়েরি ব্যবহার করা

TypeORM-এ কাস্টম SQL কুয়েরি করতে createQueryBuilder() ব্যবহার করা যায়। এটি এমন ফাংশনালিটি প্রদান করে যার মাধ্যমে আপনি কাস্টম কুয়েরি তৈরি করতে পারেন।

কাস্টম কুয়েরি উদাহরণ:

const users = await userRepository
  .createQueryBuilder("user")
  .where("user.name = :name", { name: "John Doe" })
  .getMany();

console.log(users);

এখানে, createQueryBuilder() ব্যবহার করে name ফিল্টার করা হয়েছে এবং "John Doe" নামের ব্যবহারকারীদের রিটার্ন করা হয়েছে।

৪. Update এবং Delete অপারেশন

ডেটাবেসের তথ্য আপডেট বা মুছতে update() এবং delete() মেথড ব্যবহার করা যায়।

Update উদাহরণ:

await userRepository.update({ name: "John Doe" }, { email: "newemail@example.com" });

এখানে, "John Doe" নামের ব্যবহারকারীর ইমেইল আপডেট করা হচ্ছে।

Delete উদাহরণ:

await userRepository.delete({ name: "John Doe" });

এখানে, "John Doe" নামের ব্যবহারকারী ডাটাবেস থেকে মুছে ফেলা হচ্ছে।

৫. পেজিনেশন এবং সীমাবদ্ধতা (Pagination and Limiting)

TypeORM-এ পেজিনেশন করতে take() এবং skip() মেথড ব্যবহার করা হয়।

const users = await userRepository.find({
  skip: 0,  // প্রথম পেজ
  take: 10  // ১০টি ফলাফল
});

এখানে, প্রথম ১০টি ব্যবহারকারী রিটার্ন করা হবে।


TypeORM-এ QueryBuilder এবং Repository এর মধ্যে পার্থক্য

ফিচারRepositoryQueryBuilder
ডেটাবেস অপারেশনসহজ CRUD অপারেশন (save, find, update, delete)কাস্টম এবং জটিল কুয়েরি তৈরি এবং পরিচালনা
ব্যবহারসাধারণ CRUD অপারেশন করতে সহজজটিল কুয়েরি এবং অগ্রিম ফিল্টারিংয়ের জন্য ব্যবহারযোগ্য
ফাংশনালিটিপদ্ধতিগত CRUD অপারেশন সহজে তৈরি করাSQL কুয়েরি নির্দিষ্ট কাস্টমাইজেশনের জন্য ব্যবহার করা যায়
পারফরম্যান্সসাধারণ কুয়েরি অপারেশনে কার্যকরীবৃহত্তর এবং জটিল কুয়েরি অপারেশনের জন্য কার্যকরী

সারাংশ

Repository এবং Data Access TypeORM এর মধ্যে গুরুত্বপূর্ণ অংশ। Repository Pattern ডাটাবেস টেবিলের সাথে যোগাযোগ সহজ এবং কার্যকরী করে তোলে। TypeORM-এ Repository ব্যবহার করে আপনি CRUD অপারেশন করতে পারবেন এবং কাস্টম কুয়েরি তৈরি করতে QueryBuilder ব্যবহার করতে পারেন। Repository সাধারণ CRUD অপারেশনগুলির জন্য সহজ, আর QueryBuilder জটিল কুয়েরি এবং ফিল্টারিংয়ের জন্য ব্যবহৃত হয়। TypeORM এর Repository Pattern ডেভেলপারদের একটি পরিচ্ছন্ন এবং পুনঃব্যবহারযোগ্য ডেটাবেস অ্যাকসেস লেয়ারের জন্য সহায়তা করে।

Content added By

Repository প্যাটার্ন কি?

Repository প্যাটার্ন একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা ডেটা অ্যাক্সেস লেয়ারের (ডেটাবেস) এবং অন্যান্য সিস্টেমের মধ্যে একটি অ্যাবস্ট্রাকশন (abstract) তৈরি করে। এটি ডেটাবেস অপারেশন যেমন ইনসার্ট, আপডেট, ডিলিট, এবং সিলেক্ট কার্যাবলি সহজ ও পরিষ্কারভাবে পরিচালনা করতে সহায়তা করে। Repository প্যাটার্ন ডেটাবেস অপারেশনগুলিকে ডোমেইন লজিক থেকে আলাদা করে, ফলে কোডিং আরও মডুলার ও পুনঃব্যবহারযোগ্য হয়।

ডেটাবেস অপারেশনগুলি করার জন্য সাধারণত ডিরেক্ট SQL কোড ব্যবহার করা হয়, কিন্তু Repository প্যাটার্ন ডেটাবেসের সাথে যোগাযোগের জন্য একটি নির্দিষ্ট API সরবরাহ করে, যা ডেটাবেস থেকে ডেটা আনা, সেভ করা, এবং ম্যানিপুলেট করার প্রক্রিয়াকে সহজ করে তোলে।


TypeORM এ Repository প্যাটার্ন

TypeORM এর Repository প্যাটার্ন ডেটাবেসের টেবিলগুলির সাথে কাজ করার জন্য ব্যবহৃত হয়। TypeORM নিজে থেকেই Repository ক্লাস প্রদান করে, যা ডেটাবেস টেবিলের জন্য CRUD (Create, Read, Update, Delete) অপারেশন করতে সহায়তা করে।

Repository প্যাটার্নে, TypeORM Repository ক্লাস এবং DataSource এর মাধ্যমে ডেটাবেসের সাথে যোগাযোগ করে এবং ডোমেইন এন্টিটির জন্য বিভিন্ন ডেটাবেস অপারেশন সমর্থন করে।


TypeORM এ Repository প্যাটার্নের ব্যবহার

১. Repository তৈরি করা

প্রথমে, আপনি যে Entity তৈরি করেছেন সেটি টাইপওআরএম-এর Repository এর মাধ্যমে ডেটাবেসে কাজ করবে। এই Repository ক্লাসটি ডেটাবেস টেবিলের সাথে সম্পর্কিত সমস্ত CRUD অপারেশন পরিচালনা করে।

ধরা যাক, আপনার একটি User Entity রয়েছে:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

এখন, TypeORM এর Repository ব্যবহার করে এই User Entity তে কাজ করবেন।

২. Repository এর মাধ্যমে ডেটাবেসে কাজ করা

TypeORM Repository কে DataSource থেকে নেয় এবং তারপর এটি ব্যবহার করে CRUD অপারেশন করতে পারবেন।

ডেটাবেস সংযোগ এবং Repository ব্যবহার করা:
import { AppDataSource } from './data-source';
import { User } from './entity/User';

// ডেটাবেসের সংযোগ স্থাপন
AppDataSource.initialize()
  .then(async () => {
    // Repository ইনস্ট্যান্স তৈরি
    const userRepository = AppDataSource.getRepository(User);

    // ১. নতুন ইউজার তৈরি করা
    const newUser = new User();
    newUser.name = 'John Doe';
    newUser.email = 'john@example.com';
    
    // ইউজার সেভ করা
    await userRepository.save(newUser);
    console.log('User has been saved');

    // ২. ইউজার খোঁজা
    const users = await userRepository.find();
    console.log(users);

    // ৩. ইউজার আপডেট করা
    const userToUpdate = await userRepository.findOneBy({ id: 1 });
    if (userToUpdate) {
      userToUpdate.name = 'Updated Name';
      await userRepository.save(userToUpdate);
      console.log('User has been updated');
    }

    // ৪. ইউজার ডিলিট করা
    const userToDelete = await userRepository.findOneBy({ id: 1 });
    if (userToDelete) {
      await userRepository.remove(userToDelete);
      console.log('User has been deleted');
    }
  })
  .catch((error) => console.log(error));

৩. Repository Methods:

  • find(): এটি টেবিলের সব রেকর্ড নিয়ে আসে।
  • findOne(): এটি একটি নির্দিষ্ট শর্তে একটি রেকর্ড খুঁজে বের করে।
  • save(): এটি ডেটাবেসে নতুন রেকর্ড ইনসার্ট বা আপডেট করে।
  • remove(): এটি ডেটাবেস থেকে একটি রেকর্ড ডিলিট করে।
  • findOneBy(): এটি কোনো শর্ত অনুযায়ী একটি রেকর্ড খুঁজে বের করে।

৪. Custom Repository Methods

আপনি আপনার নিজস্ব Repository Methods তৈরি করতে পারেন, যেগুলি নির্দিষ্ট ডেটাবেস অপারেশনগুলি চালায়। TypeORM এর মাধ্যমে Custom Repository তৈরি করতে @EntityRepository ডেকোরেটর ব্যবহার করা যেতে পারে।

import { EntityRepository, Repository } from 'typeorm';
import { User } from './entity/User';

@EntityRepository(User)
export class UserRepository extends Repository<User> {
  // একটি কাস্টম ফাংশন তৈরি
  async findByName(name: string): Promise<User[]> {
    return this.createQueryBuilder("user")
      .where("user.name = :name", { name })
      .getMany();
  }
}

এখন, এই কাস্টম রেপোজিটরি মেথড findByName ব্যবহার করে আপনি সহজেই নির্দিষ্ট নামের ভিত্তিতে ইউজার খুঁজে বের করতে পারবেন।

const userRepository = AppDataSource.getRepository(UserRepository);
const usersByName = await userRepository.findByName('John Doe');
console.log(usersByName);

কেন Repository প্যাটার্ন ব্যবহার করবেন?

  1. ডেটাবেস অ্যাক্সেস সহজ: Repository প্যাটার্ন ডেটাবেস অ্যাক্সেসের কাজগুলো ক্লিন এবং সহজ করে তোলে। আপনি সরাসরি SQL লিখতে না করেই CRUD অপারেশন করতে পারেন।
  2. ডেটাবেস লজিক আবরোধ: Repository প্যাটার্ন ডেটাবেস লজিক এবং অ্যাপ্লিকেশনের লজিককে আলাদা করে, যার ফলে কোডিং আরও মডুলার এবং রিডেবল হয়।
  3. টেস্টেবিলিটি: Repository প্যাটার্ন ব্যবহারের মাধ্যমে কোডে ইউনিট টেস্টিং করা সহজ হয়ে ওঠে, কারণ ডেটাবেসের সাথে সরাসরি যোগাযোগের পরিবর্তে ফাংশনালিটি টেস্ট করা যায়।
  4. রিইউজেবল কোড: Repository প্যাটার্ন ফাংশন এবং লজিকের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে, যেহেতু একই Repository কেবল একটি ক্লাস দিয়ে বিভিন্ন টেবিলের সাথে কাজ করতে ব্যবহার করা যেতে পারে।

সারাংশ

Repository প্যাটার্ন একটি প্রোগ্রামিং ডিজাইন প্যাটার্ন যা ডেটাবেসের সাথে যোগাযোগ সহজ এবং কার্যকরী করে তোলে। TypeORM ব্যবহার করে আপনি সহজে Repository প্যাটার্ন প্রয়োগ করতে পারেন এবং ডেটাবেসের বিভিন্ন অপারেশনগুলো (CRUD) পরিচালনা করতে পারেন। এটি কোডের স্বচ্ছতা, রক্ষণাবেক্ষণ এবং স্কেলেবিলিটি বৃদ্ধি করে এবং ডেটাবেসের সাথে যোগাযোগের জন্য একটি সহজ API প্রদান করে। TypeORM এর Repository প্যাটার্ন ব্যবহারের মাধ্যমে ডেটাবেস অপারেশনগুলো আরও মডুলার এবং পুনঃব্যবহারযোগ্য হয়ে ওঠে।

Content added By

TypeORM-এ Repository কি?

Repository TypeORM-এ একটি ডেটাবেস অ্যাক্সেস প্যাটার্ন যা ডেটাবেস অপারেশন যেমন Create, Read, Update, এবং Delete (CRUD) পরিচালনা করে। এটি ডেটাবেসের Entities-এর উপর কাজ করতে ব্যবহৃত হয় এবং TypeORM এর Repository API খুবই শক্তিশালী এবং কাস্টম কোয়েরি তৈরির জন্য সহায়তা করে।

Repository ক্লাসটি TypeORM এর মাধ্যমে ডেটাবেস টেবিলের সঙ্গে কাজ করার জন্য একটি এবস্ট্র্যাকশন প্রদান করে, যেখানে আপনি কাস্টম ফাংশনগুলো লিখতে পারেন যা Entity এর উপর ভিত্তি করে ডেটাবেসের মধ্যে ডেটা অপারেশন পরিচালনা করবে।


Repository তৈরি করা

TypeORM-এ Repository তৈরি করতে হলে আপনি Entity ক্লাসের সাথে যুক্ত একটি Repository তৈরি করবেন। @EntityRepository ডেকোরেটর ব্যবহার করে আপনি কাস্টম Repository তৈরি করতে পারেন, যা Entity এর জন্য কাস্টম CRUD অপারেশন করতে সহায়তা করবে।

Repository তৈরি করার উদাহরণ:

ধরা যাক আমাদের একটি User Entity আছে এবং আমরা একটি UserRepository তৈরি করতে চাই যা কাস্টম ডেটাবেস অপারেশনগুলো সম্পাদন করবে।


১. Entity তৈরি করা (User Entity)

প্রথমে, আমাদের একটি Entity ক্লাস তৈরি করতে হবে যা ডেটাবেসের টেবিলের প্রতিনিধিত্ব করবে।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

এখানে, User Entity একটি ডাটাবেস টেবিলের প্রতিনিধিত্ব করছে, যেখানে id, name, এবং email কলাম রয়েছে।


২. Repository তৈরি করা (UserRepository)

এখন, আমরা User Entity এর জন্য একটি কাস্টম Repository তৈরি করব। TypeORM 0.3.x সংস্করণ থেকে @EntityRepository ডেকোরেটরটি সরানো হয়েছে, তাই আমরা সরাসরি DataSource.getRepository() ব্যবহার করে Repository তৈরি করতে পারি।

UserRepository.ts উদাহরণ:

import { Repository } from "typeorm";
import { User } from "../entities/User";
import { AppDataSource } from "../data-source"; // আপনার ডেটাবেস ডেটাসোর্স ইম্পোর্ট করুন

export class UserRepository extends Repository<User> {
  // কাস্টম মেথড যা একটি ব্যবহারকারীর ইমেইল অনুসারে অনুসন্ধান করবে
  async findUserByEmail(email: string): Promise<User | null> {
    return this.findOne({
      where: { email },
    });
  }

  // কাস্টম মেথড যা ব্যবহারকারীর নাম অনুযায়ী অনুসন্ধান করবে
  async findUsersByName(name: string): Promise<User[]> {
    return this.find({
      where: { name },
    });
  }
}

এখানে, UserRepository ক্লাসে দুটি কাস্টম মেথড রয়েছে:

  • findUserByEmail: ইমেইল দ্বারা একটি ব্যবহারকারী খুঁজে বের করবে।
  • findUsersByName: নাম অনুসারে একাধিক ব্যবহারকারী খুঁজে বের করবে।

৩. Repository ব্যবহার করা

এখন, Repository ব্যবহার করে ডেটাবেস অপারেশনগুলো পরিচালনা করা হবে। TypeORM এর AppDataSource.getRepository() মেথড ব্যবহার করে আমরা UserRepository তৈরি করতে পারি এবং সেই Repository এর মাধ্যমে ডেটাবেস অপারেশন চালাতে পারি।

UserService.ts উদাহরণ:

import { AppDataSource } from "../data-source";
import { User } from "../entities/User";
import { UserRepository } from "../repositories/UserRepository";

export class UserService {
  private userRepository: UserRepository;

  constructor() {
    // DataSource থেকে UserRepository ইনস্ট্যান্স রিটার্ন করা হচ্ছে
    this.userRepository = AppDataSource.getRepository(User) as UserRepository;
  }

  // সমস্ত ব্যবহারকারী রিটার্ন করবে
  async getAllUsers(): Promise<User[]> {
    return this.userRepository.find();
  }

  // ইমেইল অনুসারে ব্যবহারকারী খুঁজে বের করা
  async getUserByEmail(email: string): Promise<User | null> {
    return this.userRepository.findUserByEmail(email);
  }

  // নাম অনুসারে ব্যবহারকারী খুঁজে বের করা
  async getUsersByName(name: string): Promise<User[]> {
    return this.userRepository.findUsersByName(name);
  }

  // নতুন ব্যবহারকারী তৈরি করা
  async createUser(name: string, email: string): Promise<User> {
    const user = new User();
    user.name = name;
    user.email = email;
    return this.userRepository.save(user);
  }
}

এখানে, UserService ক্লাসটি UserRepository ব্যবহার করে ডেটাবেসে CRUD অপারেশনগুলো পরিচালনা করছে। getRepository() মেথডের মাধ্যমে UserRepository ব্যবহার করা হচ্ছে এবং বিভিন্ন কাস্টম মেথড কল করা হচ্ছে।


৪. Controller-এ Repository ব্যবহার করা

এখন, আপনি যখন API রাউট বা কন্ট্রোলারের মাধ্যমে এই Repository ব্যবহার করবেন, তখন UserService কে ব্যবহার করে ডেটাবেস অপারেশন করতে হবে।

UserController.ts উদাহরণ:

import { Request, Response } from "express";
import { UserService } from "../services/UserService";

export class UserController {
  private userService: UserService;

  constructor() {
    this.userService = new UserService();
  }

  // সমস্ত ব্যবহারকারী প্রাপ্তির API
  async getUsers(req: Request, res: Response): Promise<Response> {
    const users = await this.userService.getAllUsers();
    return res.json(users);
  }

  // ইমেইল অনুসারে ব্যবহারকারী প্রাপ্তির API
  async getUserByEmail(req: Request, res: Response): Promise<Response> {
    const email = req.params.email;
    const user = await this.userService.getUserByEmail(email);
    return user ? res.json(user) : res.status(404).json({ message: "User not found" });
  }

  // নতুন ব্যবহারকারী তৈরি করার API
  async createUser(req: Request, res: Response): Promise<Response> {
    const { name, email } = req.body;
    const newUser = await this.userService.createUser(name, email);
    return res.status(201).json(newUser);
  }
}

এখানে, UserController কন্ট্রোলার ক্লাসটি UserService ব্যবহার করে API রাউটগুলিতে ডেটাবেস অপারেশনগুলোর জন্য কল করছে।


৫. Repository-র সুবিধা

  • ডেটাবেস অ্যাক্সেসের সহজতা: Repository TypeORM-এ ডেটাবেসের সাথে যোগাযোগকে সহজতর করে, যেখানে SQL কোড না লিখেই ডেটাবেসে CRUD অপারেশন করা যায়।
  • কাস্টম ফাংশনালিটি: Repository-তে কাস্টম ফাংশনালিটি যেমন findUserByEmail এবং findUsersByName যোগ করা যায়, যা ডেটাবেসে দক্ষভাবে কুয়েরি পরিচালনা করতে সহায়তা করে।
  • বিজনেস লজিক আলাদা করা: Repository ডেটাবেসের অপারেশনগুলোকে আলাদা করে রাখে, এবং সার্ভিস ক্লাসে ব্যবসায়িক লজিক রাখতে সাহায্য করে।

সারাংশ

TypeORM Repository ডেটাবেসের উপর CRUD অপারেশন এবং কাস্টম কুয়েরি পরিচালনার জন্য একটি শক্তিশালী উপায় প্রদান করে। Repository তৈরি এবং ব্যবহার করার মাধ্যমে আপনি ডেটাবেসে নিরাপদ এবং কার্যকরীভাবে কাজ করতে পারবেন। TypeORM এর Repository এবং Service গঠন ব্যবহার করে আপনি ডেটাবেস সম্পর্কিত লজিক আলাদা করতে পারবেন এবং কোডের রক্ষণাবেক্ষণ সহজ করে তুলতে পারবেন।

Content added By

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 (বৃদ্ধি) করেছে এবং দুইটি কাস্টম মেথড তৈরি করেছে:

  1. findUsersByAge(age: number): এই মেথডটি একটি নির্দিষ্ট বয়সের উপরে থাকা সকল ইউজারদের রিটার্ন করবে।
  2. 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 ক্লাসের মাধ্যমে কাস্টম রেপোজিটরি তৈরি করা সম্ভব।

এই কাস্টম রেপোজিটরি আপনার প্রজেক্টের স্কেল এবং কার্যকারিতা বৃদ্ধি করতে পারে এবং ডেটাবেস কোডিংকে আরও পুনঃব্যবহারযোগ্য ও কার্যকরী করে তুলতে সাহায্য করে।

Content added By

TypeORM Query Builder কি?

TypeORM Query Builder একটি শক্তিশালী ইউটিলিটি যা TypeORM এ SQL কুয়েরি তৈরি এবং এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি আপনাকে জটিল SQL কুয়েরি তৈরি করতে সাহায্য করে, যেমন JOIN, GROUP BY, HAVING, ORDER BY, এবং LIMIT অপারেশনগুলি। Query Builder ব্যবহার করে, আপনি SQL কোড লেখার চেয়ে ডাইনামিক এবং কার্যকরী কুয়েরি তৈরি করতে পারেন।

TypeORM এর Query Builder টুলটি TypeScript বা JavaScript কোডের মাধ্যমে SQL কুয়েরি তৈরি এবং এক্সিকিউট করতে খুবই সুবিধাজনক।


Query Builder এর সুবিধা

  1. ডাইনামিক কুয়েরি তৈরি: Query Builder আপনাকে কন্ডিশনাল কুয়েরি তৈরি করার সুযোগ দেয়, যাতে নির্দিষ্ট শর্তের ভিত্তিতে কুয়েরি তৈরি করা যায়।
  2. কমপ্লেক্স কুয়েরি সহজে তৈরি করা: SQL কুয়েরির জটিল অংশগুলো সহজে তৈরি করা যায়, যেমন অ্যাগ্রিগেট ফাংশন, জয়েনস, এবং সাবকুয়েরি।
  3. SQL ইনজেকশন প্রতিরোধ: TypeORM এর Query Builder স্বয়ংক্রিয়ভাবে SQL ইনজেকশন থেকে সুরক্ষা নিশ্চিত করে, কারণ এটি প্রিপেয়ারড স্টেটমেন্ট ব্যবহার করে।

Query Builder এর মৌলিক ব্যবহার

TypeORM এ Query Builder ব্যবহার করার জন্য সাধারণত getRepository() বা createQueryBuilder() ফাংশন ব্যবহার করা হয়।

১. কোয়েরি বিল্ডারের শুরু

প্রথমে, একটি Entity-এর জন্য createQueryBuilder() ফাংশন ব্যবহার করে একটি কুয়েরি বিল্ডার তৈরি করতে হয়।

import { AppDataSource } from "./data-source";
import { User } from "./entity/User";

const userRepository = AppDataSource.getRepository(User);
const queryBuilder = userRepository.createQueryBuilder("user");

এখানে, createQueryBuilder("user") User Entity-র উপর Query Builder তৈরি করবে এবং user আলিয়াসটি ব্যবহার করবে।


২. ডেটা রিট্রিভ করা (SELECT)

Query Builder ব্যবহার করে ডেটা রিট্রিভ (SELECT) করা খুব সহজ। নিচে একটি উদাহরণ দেওয়া হলো:

const users = await queryBuilder
  .select(["user.id", "user.name", "user.email"])
  .where("user.age > :age", { age: 18 })
  .orderBy("user.name", "ASC")
  .getMany();

console.log(users);

এখানে:

  • select(): এখানে আমরা user টেবিলের id, name, এবং email কলাম সিলেক্ট করেছি।
  • where(): এখানে আমরা একটি কন্ডিশন দিয়েছেন যা age ১৮ এর বেশি হতে হবে।
  • orderBy(): ব্যবহারকারীদের নামের অক্ষর অনুসারে সাজানো হয়েছে।
  • getMany(): সমস্ত ম্যাচিং রেকর্ড ফেরত দেবে।

৩. একক রেকর্ড রিট্রিভ (getOne())

const user = await queryBuilder
  .select(["user.id", "user.name", "user.email"])
  .where("user.id = :id", { id: 1 })
  .getOne();

console.log(user);

এখানে getOne() শুধুমাত্র প্রথম ম্যাচিং রেকর্ড ফেরত দেবে।


৪. JOIN ব্যবহার করা

Query Builder ব্যবহার করে আপনি সহজেই JOIN অপারেশন করতে পারেন।

const usersWithPosts = await queryBuilder
  .select(["user.id", "user.name", "post.title"])
  .innerJoin("user.posts", "post") // user.posts হল relation
  .where("user.age > :age", { age: 18 })
  .getMany();

console.log(usersWithPosts);

এখানে:

  • innerJoin("user.posts", "post"): এটি user টেবিল এবং post টেবিলকে posts সম্পর্কের মাধ্যমে যোগ করবে। (এটি সেই সম্পর্কের ওপর নির্ভর করে যেটি Entity-তে ডিফাইন করা থাকে।)

৫. GROUP BY এবং HAVING ব্যবহার করা

Group by এবং Having এর মাধ্যমে আপনি গ্রুপিং এবং শর্তাবলী দিয়ে ডেটা ফিল্টার করতে পারবেন।

const result = await queryBuilder
  .select("user.age")
  .addSelect("COUNT(user.id)", "userCount")
  .groupBy("user.age")
  .having("COUNT(user.id) > :count", { count: 2 })
  .getRawMany();

console.log(result);

এখানে:

  • groupBy(): এটি ব্যবহার করে user.age অনুযায়ী গ্রুপিং করা হয়েছে।
  • having(): গ্রুপের মধ্যে যেগুলি ২টির বেশি user.id রয়েছে, সেই গ্রুপগুলো রিটার্ন হবে।

৬. INSERT এবং UPDATE

Query Builder ব্যবহার করে আপনি ডেটাবেসে ডেটা ইনসার্ট এবং আপডেট করতে পারেন।

INSERT Example:

await queryBuilder
  .insert()
  .into(User)
  .values([
    { name: "John", email: "john@example.com", age: 25 },
    { name: "Jane", email: "jane@example.com", age: 28 },
  ])
  .execute();

এখানে, insert() ফাংশনটি User Entity-তে নতুন ইউজার ইনসার্ট করছে।

UPDATE Example:

await queryBuilder
  .update(User)
  .set({ name: "Updated Name" })
  .where("id = :id", { id: 1 })
  .execute();

এখানে, update() ফাংশনটি User Entity-এর name ফিল্ড আপডেট করছে।


৭. DELETE ব্যবহার করা

Query Builder দিয়ে ডেটা ডিলিটও করা যেতে পারে।

await queryBuilder
  .delete()
  .from(User)
  .where("id = :id", { id: 1 })
  .execute();

এখানে, delete() ফাংশনটি User Entity থেকে একটি রেকর্ড মুছে ফেলছে।


৮. Raw SQL কোয়েরি ব্যবহার করা

TypeORM Query Builder আপনাকে Raw SQL কোয়েরি লেখার সুযোগও দেয়, যা কিছু পরিস্থিতিতে প্রয়োজন হতে পারে।

const rawQueryResult = await queryBuilder
  .getRawMany();

console.log(rawQueryResult);

এখানে getRawMany() রিজাল্টগুলিকে Raw SQL ফরম্যাটে রিটার্ন করে।


সারাংশ

TypeORM Query Builder হল একটি শক্তিশালী এবং ফ্লেক্সিবল টুল যা TypeORM ব্যবহার করে ডেটাবেস কুয়েরি তৈরি এবং এক্সিকিউট করতে সহায়তা করে। Query Builder এর মাধ্যমে আপনি খুব সহজেই JOIN, GROUP BY, HAVING, INSERT, UPDATE, DELETE এবং Raw SQL কুয়েরি করতে পারেন। এটি SQL ইনজেকশন প্রতিরোধ নিশ্চিত করে, এবং ডাইনামিক কুয়েরি তৈরিতে সহায়তা করে।

TypeORM এর Query Builder ব্যবহারে আপনার ডেটাবেস কুয়েরি লেখার প্রক্রিয়া সহজ, দ্রুত এবং নিরাপদ হবে।

Content added By
Promotion

Are you sure to start over?

Loading...