Relation Mapping in TypeORM
Relation Mapping TypeORM-এ ডেটাবেস টেবিলগুলির মধ্যে সম্পর্ক তৈরি করার প্রক্রিয়া। TypeORM আপনার JavaScript বা TypeScript ক্লাস (এন্টিটি) গুলিকে ডেটাবেস টেবিলের সাথে ম্যাপ করে, এবং সম্পর্কিত এন্টিটির মধ্যে ডেটা সম্পর্কিত সমস্ত অপারেশন পরিচালনা করার জন্য বিভিন্ন ডেকোরেটর (decorators) ব্যবহার করতে সাহায্য করে।
TypeORM-এ সাধারণত চারটি ধরনের সম্পর্ক থাকে:
- One-to-One Relation: এক টেবিলের একটি রেকর্ড অন্য টেবিলের একটির সাথে সম্পর্কিত।
- One-to-Many Relation: এক টেবিলের একটি রেকর্ড অনেক টেবিলের রেকর্ডের সাথে সম্পর্কিত।
- Many-to-One Relation: অনেক টেবিলের রেকর্ড এক টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত।
- Many-to-Many Relation: অনেক টেবিলের রেকর্ড অন্য অনেক টেবিলের রেকর্ডের সাথে সম্পর্কিত।
TypeORM এই সম্পর্কগুলি তৈরি করতে @OneToOne, @OneToMany, @ManyToOne, @ManyToMany ডেকোরেটর সরবরাহ করে।
1. One-to-One Relation Mapping
একটি One-to-One সম্পর্ক তৈরি করতে, TypeORM এ @OneToOne এবং @JoinColumn ডেকোরেটর ব্যবহার করা হয়। এখানে, দুটি টেবিলের মধ্যে প্রতিটি রেকর্ডের একটি সম্পর্ক থাকবে।
উদাহরণ: User এবং Profile সম্পর্ক
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm";
import { Profile } from "./Profile";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(() => Profile)
@JoinColumn()
profile: Profile;
}
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
bio: string;
}
এখানে, User এবং Profile টেবিলের মধ্যে একটি One-to-One সম্পর্ক তৈরি হয়েছে। @JoinColumn ডেকোরেটর ব্যবহার করা হয়েছে যাতে সম্পর্কিত টেবিলের মধ্যে কনটেক্সট এবং সম্পর্ক সঠিকভাবে চিহ্নিত হয়।
2. One-to-Many and Many-to-One Relation Mapping
One-to-Many এবং Many-to-One সম্পর্ক সাধারণত একে অপরের সাথে জড়িত থাকে। এখানে একটি One-to-Many সম্পর্ক তৈরি করা হয়েছে যেখানে এক Category টেবিলের একটি রেকর্ড একাধিক Product টেবিলের রেকর্ডের সাথে সম্পর্কিত।
উদাহরণ: Category এবং Product সম্পর্ক
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Product } from "./Product";
@Entity()
export class Category {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Product, product => product.category)
products: Product[];
}
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToOne(() => Category, category => category.products)
category: Category;
}
এখানে, Category এবং Product টেবিলের মধ্যে One-to-Many এবং Many-to-One সম্পর্ক স্থাপন করা হয়েছে। @ManyToOne ডেকোরেটর Product টেবিলের ভিতরে ব্যবহার করা হয়েছে, যাতে এটি Category টেবিলের সাথে সম্পর্কিত থাকে।
3. Many-to-Many Relation Mapping
Many-to-Many সম্পর্ক একাধিক রেকর্ডকে একাধিক রেকর্ডের সাথে সম্পর্কিত করে। Many-to-Many সম্পর্ক তৈরি করতে @ManyToMany এবং @JoinTable ডেকোরেটর ব্যবহার করা হয়।
উদাহরণ: Student এবং Course সম্পর্ক
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from "typeorm";
import { Course } from "./Course";
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => Course)
@JoinTable()
courses: Course[];
}
@Entity()
export class Course {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => Student)
students: Student[];
}
এখানে, Student এবং Course টেবিলের মধ্যে Many-to-Many সম্পর্ক তৈরি করা হয়েছে। @JoinTable ডেকোরেটরটি একটি মধ্যবর্তী টেবিল তৈরি করতে ব্যবহৃত হয়, যেটি দুই টেবিলের মধ্যে সম্পর্ক স্থাপন করে।
Nested Queries in TypeORM
Nested Queries হল এমন কুয়েরি যেখানে একটি সাব-কুয়েরি (subquery) অন্য কুয়েরির মধ্যে ব্যবহার করা হয়। TypeORM এ QueryBuilder ব্যবহার করে আপনি nested queries তৈরি করতে পারেন।
TypeORM-এ QueryBuilder এর মাধ্যমে আপনি জটিল কুয়েরি তৈরি করতে পারেন, যার মধ্যে INNER JOIN, LEFT JOIN, WHERE শর্তাবলী, এবং subqueries অন্তর্ভুক্ত থাকে।
১. Simple Nested Query with QueryBuilder
import { createQueryBuilder } from "typeorm";
import { User } from "./User";
async function getUserData() {
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.profile", "profile")
.where("user.id = :id", { id: 1 })
.getOne();
console.log(user);
}
এখানে, LEFT JOIN ব্যবহার করা হয়েছে, যাতে User এবং তার সম্পর্কিত Profile টেবিলের ডেটা একসাথে পাওয়া যায়।
২. Using Subqueries with QueryBuilder
import { createQueryBuilder } from "typeorm";
import { User } from "./User";
async function getUserWithPosts() {
const user = await createQueryBuilder("user")
.leftJoin(
subQuery => {
return subQuery
.select("post.title")
.from("post", "post")
.where("post.userId = user.id");
},
"post_titles",
"user.id = post_titles.userId"
)
.getOne();
console.log(user);
}
এখানে একটি subquery ব্যবহার করা হয়েছে, যেখানে Post টেবিলের টাইটেলগুলি বের করা হচ্ছে, যা একটি সাব-কুয়েরি হিসাবে User টেবিলের সাথে যুক্ত।
সারাংশ
TypeORM ডেটাবেস সম্পর্কগুলি সহজে পরিচালনা করার জন্য শক্তিশালী Relation Mapping ফিচার সরবরাহ করে। One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কগুলি সহজেই TypeORM-এ তৈরি করা যেতে পারে, যার মাধ্যমে ডেটাবেসের মধ্যে সম্পর্কিত তথ্যগুলিকে ম্যাপ করা হয়। একইভাবে, Nested Queries এর মাধ্যমে TypeORM-এ জটিল কুয়েরি তৈরি করা সম্ভব, যেখানে QueryBuilder এবং subqueries ব্যবহার করে ডেটাবেস থেকে নির্দিষ্ট ডেটা বের করা যায়। TypeORM এর এই ফিচারগুলি ডেটাবেস ম্যানিপুলেশন এবং সম্পর্কিত ডেটা সংগ্রহ করা খুবই কার্যকরী ও সহজ করে তোলে।
Read more