Doctrine ORM এর মাধ্যমে ডেটাবেজ ইন্টিগ্রেশন

সিম্ফনি (Symfony) - Web Development

215

Symfony-তে ডেটাবেজ ইন্টিগ্রেশন করার জন্য Doctrine ORM (Object-Relational Mapping) ব্যবহৃত হয়। Doctrine ORM একটি শক্তিশালী PHP লাইব্রেরি যা ডেটাবেজ এবং PHP অবজেক্টের মধ্যে সম্পর্ক স্থাপন করে। Symfony এবং Doctrine ORM একসাথে ব্যবহৃত হলে, এটি ডেটাবেজের সাথে কাজ করা অনেক সহজ ও কার্যকর করে তোলে।

Doctrine ORM ডেটাবেজের সাথে সংযোগ স্থাপন, ডেটা পড়া, লেখার কাজগুলো ORM প্যাটার্নের মাধ্যমে পরিচালনা করতে সাহায্য করে, যা ডেটাবেজ অপারেশনকে অবজেক্ট ওরিয়েন্টেড স্টাইলে পরিচালিত করে।


Doctrine ORM কী?

Doctrine ORM একটি ডেটাবেজ লাইব্রেরি যা ডেটাবেজের সাথে অবজেক্টওরিয়েন্টেড প্রোগ্রামিং (OOP) প্যাটার্নের মাধ্যমে যোগাযোগ স্থাপন করে। Doctrine ORM PHP অবজেক্টগুলিকে ডেটাবেজের টেবিল হিসেবে ম্যাপ করে, ফলে ডেটাবেজের সাথে কাজ করা আরও সহজ হয়।

Doctrine ORM ব্যবহারের মাধ্যমে, আপনি SQL কোয়েরি লেখার পরিবর্তে, PHP ক্লাস ব্যবহার করে ডেটাবেজ অপারেশনগুলো করতে পারেন।


Symfony-তে Doctrine ORM সেটআপ এবং ব্যবহার

Doctrine ORM Symfony-তে ব্যবহারের জন্য প্রথমে কিছু সেটআপ করতে হয়। নিচে ধাপে ধাপে Symfony প্রজেক্টে Doctrine ORM সেটআপ এবং ব্যবহার করার পদ্ধতি বর্ণনা করা হলো।


১. Doctrine ORM ইনস্টলেশন

Symfony প্রজেক্টে Doctrine ORM ইনস্টল করতে Composer ব্যবহার করা হয়।

composer require symfony/orm-pack
composer require doctrine/doctrine-migrations-bundle

এটি Doctrine ORM এবং ডাটাবেস মাইগ্রেশন ব্যবস্থাপনা প্যাকেজ ইনস্টল করবে।


২. ডেটাবেজ কনফিগারেশন

Symfony-তে Doctrine ব্যবহার করতে হলে প্রথমে .env ফাইলে ডেটাবেজ কনফিগারেশন যোগ করতে হবে।

.env ফাইল কনফিগারেশন:

DATABASE_URL="mysql://username:password@127.0.0.1:3306/my_database"

এখানে username, password, এবং my_database আপনার ডাটাবেজের তথ্য অনুযায়ী প্রতিস্থাপন করুন।


৩. Doctrine Entity তৈরি করা

Doctrine ORM ব্যবহার করার জন্য আপনাকে Entity তৈরি করতে হবে, যা ডেটাবেজের টেবিলের সাথে সম্পর্কিত হবে। Symfony-তে Entity তৈরি করতে make:entity কমান্ড ব্যবহার করা হয়।

Entity তৈরি করার কমান্ড:

php bin/console make:entity

এরপর, Entity নাম (যেমন Product) এবং এর ফিল্ড (যেমন name, price ইত্যাদি) প্রদান করুন। Symfony Entity ক্লাসটি তৈরি করবে এবং আপনি ডেটাবেজ টেবিলের জন্য এগুলি ব্যবহার করতে পারবেন।

Entity উদাহরণ (Product):

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string', length: 100)]
    private $name;

    #[ORM\Column(type: 'float')]
    private $price;

    // Getter and Setter methods
    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }

    public function getPrice(): ?float
    {
        return $this->price;
    }

    public function setPrice(float $price): self
    {
        $this->price = $price;
        return $this;
    }
}

৪. ডাটাবেজ মাইগ্রেশন তৈরি করা

Doctrine ORM এর সাহায্যে ডেটাবেজের জন্য মাইগ্রেশন তৈরি করা হয়, যা টেবিলগুলি তৈরি, পরিবর্তন বা মুছে ফেলার কাজ করে। Symfony-তে মাইগ্রেশন তৈরি করতে make:migration কমান্ড ব্যবহার করা হয়।

মাইগ্রেশন তৈরি:

php bin/console make:migration

এটি আপনার Entity-এর ভিত্তিতে একটি নতুন মাইগ্রেশন ফাইল তৈরি করবে।

মাইগ্রেশন চালানো:

php bin/console doctrine:migrations:migrate

এই কমান্ডটি আপনার ডেটাবেজে টেবিলগুলি তৈরি করবে, যা আপনি Entity ক্লাসের মাধ্যমে সংজ্ঞায়িত করেছেন।


৫. ডেটাবেজ অপারেশন (CRUD) করা

Doctrine ORM-এর মাধ্যমে ডেটাবেজের মধ্যে ডেটা পড়া, লেখা, আপডেট এবং মুছে ফেলা (CRUD অপারেশন) খুব সহজ।

ডেটা ইনসার্ট করা (Create):

use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;

public function createProduct(EntityManagerInterface $entityManager)
{
    $product = new Product();
    $product->setName('Laptop');
    $product->setPrice(1000);

    $entityManager->persist($product); // Entity persistence
    $entityManager->flush(); // Save to database
}

ডেটা পড়া (Read):

use App\Entity\Product;

public function getProduct(EntityManagerInterface $entityManager, $id)
{
    $product = $entityManager->getRepository(Product::class)->find($id);
    return $product;
}

ডেটা আপডেট করা (Update):

public function updateProduct(EntityManagerInterface $entityManager, $id)
{
    $product = $entityManager->getRepository(Product::class)->find($id);
    if ($product) {
        $product->setPrice(1200); // Update price
        $entityManager->flush(); // Save changes
    }
}

ডেটা মুছে ফেলা (Delete):

public function deleteProduct(EntityManagerInterface $entityManager, $id)
{
    $product = $entityManager->getRepository(Product::class)->find($id);
    if ($product) {
        $entityManager->remove($product); // Remove product
        $entityManager->flush(); // Commit changes
    }
}

৬. Doctrine Query Builder ব্যবহার করা

Doctrine ORM আরও একটি শক্তিশালী বৈশিষ্ট্য হল Query Builder, যা ডাইনামিক SQL কুয়েরি তৈরি করতে সহায়ক। এর মাধ্যমে আপনি কাস্টম SQL কুয়েরি তৈরি করে ডেটাবেজের ডেটা ফিল্টার করতে পারবেন।

Query Builder উদাহরণ:

$products = $entityManager->createQueryBuilder()
    ->select('p')
    ->from(Product::class, 'p')
    ->where('p.price > :price')
    ->setParameter('price', 500)
    ->getQuery()
    ->getResult();

Doctrine এর সুবিধা

  1. অবজেক্ট-ওরিয়েন্টেড পদ্ধতি:
    Doctrine ORM PHP অবজেক্টের মাধ্যমে ডেটাবেজ পরিচালনা করার সুবিধা দেয়, যা ডেটাবেজের সাথে সম্পর্কিত কোড লেখাকে অনেক সহজ এবং পরিষ্কার করে।
  2. ডেটাবেজ নির্দিষ্ট কোডের প্রয়োজনীয়তা কমে যায়:
    Doctrine SQL কোয়েরি লেখার পরিবর্তে অবজেক্টের মাধ্যমে ডেটাবেজ অপারেশন সম্পাদন করতে সাহায্য করে, যার ফলে কোড সংক্ষেপিত হয়।
  3. মাইগ্রেশন সুবিধা:
    Doctrine এর মাধ্যমে মাইগ্রেশন পরিচালনা সহজ হয়, যা ডেটাবেজ স্কিমার পরিবর্তন করা, নতুন ফিচার যোগ করা বা পুরনো স্কিমা মুছে ফেলা খুব সহজ করে।

সারাংশ

Doctrine ORM Symfony-তে ডেটাবেজ পরিচালনা করার একটি শক্তিশালী টুল। এটি ডেটাবেজ এবং PHP অবজেক্টের মধ্যে সম্পর্ক স্থাপন করে এবং সহজে CRUD অপারেশন সম্পাদন করতে দেয়। Symfony-তে Doctrine ORM ব্যবহার করে ডেটাবেজ সংযোগ, Entity তৈরি, মাইগ্রেশন পরিচালনা এবং ডেটা অপারেশনগুলি দ্রুত এবং কার্যকরভাবে করা যায়। Doctrine ORM Symfony ডেভেলপমেন্টে একটি অপরিহার্য উপাদান, যা ডেটাবেজ ম্যানেজমেন্টকে অনেক সহজ ও সুশৃঙ্খল করে তোলে।

Content added By

Doctrine ORM (Object-Relational Mapping) হলো একটি PHP লাইব্রেরি যা ডাটাবেসের ডেটাকে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণায় রূপান্তর করে। এটি Symfony প্রজেক্টে ডাটাবেসের সাথে কাজ করতে ব্যবহৃত হয় এবং ডাটাবেস অপারেশন যেমন ইনসার্ট, আপডেট, ডিলিট, সিলেক্ট খুবই সহজ ও কার্যকরীভাবে পরিচালনা করতে সাহায্য করে। Doctrine ORM Symfony-এর ডিফল্ট ডাটাবেস ইন্টারফেস এবং এতে ডাটাবেসের সাথে ম্যানুয়ালি কাজ করার পরিবর্তে আপনি PHP অবজেক্টের মাধ্যমে ডেটা পরিচালনা করতে পারেন।


Doctrine ORM কী?

Doctrine ORM হল একটি শক্তিশালী ডাটাবেস ম্যানেজমেন্ট সিস্টেম, যা অবজেক্ট-রিলেশনাল মডেল (ORM) প্যাটার্ন অনুসরণ করে। এটি PHP অবজেক্টগুলিকে ডাটাবেসের টেবিল এবং রো-এর সাথে সম্পর্কিত করে। Doctrine-এ ডাটাবেসের প্রতিটি টেবিল একটি PHP ক্লাস দ্বারা প্রতিনিধিত্ব করা হয় এবং প্রতিটি টেবিলের রো একটি PHP অবজেক্টের মাধ্যমে কাজ করে।

Doctrine ORM এর প্রধান বৈশিষ্ট্য:

  1. অবজেক্ট-ওরিয়েন্টেড ডাটাবেস ম্যানেজমেন্ট: Doctrine ORM ডাটাবেসের টেবিলগুলিকে PHP ক্লাস হিসেবে ব্যবহার করে এবং প্রতিটি রো-কে অবজেক্ট হিসেবে প্রতিনিধিত্ব করে।
  2. ডাটাবেস অপারেশন সহজ করে: Doctrine ORM-এর মাধ্যমে ডাটাবেসের কার্যক্রম যেমন ইনসার্ট, আপডেট, ডিলিট এবং সিলেক্ট পরিচালনা করা যায়, যা সাধারণ SQL কোডের তুলনায় অনেক বেশি সহজ এবং কমপ্যাক্ট।
  3. ডাটাবেসের সাথে একাধিক সম্পর্ক (Relations): Doctrine ORM একটি শক্তিশালী সম্পর্ক ব্যবস্থার (OneToMany, ManyToOne, ManyToMany) মাধ্যমে ডাটাবেসের টেবিলের মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে।
  4. SQL জেনারেশন স্বয়ংক্রিয়: Doctrine স্বয়ংক্রিয়ভাবে SQL কোড তৈরি করে, আপনাকে সোজাসুজি PHP অবজেক্টের সাথে কাজ করতে দেয়।

Doctrine ORM কিভাবে কাজ করে?

Doctrine ORM ব্যবহার করতে, আপনাকে প্রথমে একটি Entity (অথবা মডেল) তৈরি করতে হবে যা ডাটাবেসের টেবিলের প্রতিনিধিত্ব করবে। তারপর, Doctrine আপনাকে PHP ক্লাসের মাধ্যমে ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন করতে সাহায্য করবে।

Doctrine ORM এ Entity তৈরি করা

  1. Entity তৈরি:

    Symfony-তে Doctrine Entity তৈরি করতে, আপনি make:entity কমান্ড ব্যবহার করতে পারেন।

    কমান্ড:

    php bin/console make:entity
    

    উদাহরণ হিসেবে, একটি Product Entity তৈরি করা যেতে পারে:

    // src/Entity/Product.php
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    #[ORM\Entity]
    class Product
    {
        #[ORM\Id]
        #[ORM\GeneratedValue]
        #[ORM\Column(type: 'integer')]
        private $id;
    
        #[ORM\Column(type: 'string', length: 100)]
        private $name;
    
        #[ORM\Column(type: 'float')]
        private $price;
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getName(): ?string
        {
            return $this->name;
        }
    
        public function setName(string $name): self
        {
            $this->name = $name;
            return $this;
        }
    
        public function getPrice(): ?float
        {
            return $this->price;
        }
    
        public function setPrice(float $price): self
        {
            $this->price = $price;
            return $this;
        }
    }
    
  2. ডাটাবেসে Entity তৈরি করা:

    এখন, Product Entity তৈরি হলে, ডাটাবেসে Entity এর জন্য টেবিল তৈরি করতে Doctrine মাইগ্রেশন ব্যবহার করতে হয়।

    প্রথমে মাইগ্রেশন তৈরি করতে:

    php bin/console make:migration
    

    তারপর মাইগ্রেশন চালান:

    php bin/console doctrine:migrations:migrate
    
  3. ডাটাবেসে ডেটা ইনসার্ট করা:

    Doctrine এর মাধ্যমে ডেটাবেসে ডেটা ইনসার্ট করা অনেক সহজ। এটি EntityManager ব্যবহার করে করা হয়।

    উদাহরণ:

    // src/Controller/ProductController.php
    namespace App\Controller;
    
    use App\Entity\Product;
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    
    class ProductController extends AbstractController
    {
        public function create(EntityManagerInterface $entityManager): Response
        {
            $product = new Product();
            $product->setName('Laptop')
                    ->setPrice(999.99);
    
            $entityManager->persist($product);  // Product কে EntityManager-এ পাস করা
            $entityManager->flush();  // ডেটাবেসে ইনসার্ট করা
    
            return new Response('Product created with ID ' . $product->getId());
        }
    }
    

Doctrine ORM এর সম্পর্ক

Doctrine ORM বিভিন্ন ধরনের সম্পর্ক সমর্থন করে, যা ডাটাবেসের টেবিলগুলির মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে।

  1. OneToMany সম্পর্ক: একটি Entity অন্য Entity-এর একাধিক রেকর্ডের সাথে সম্পর্কিত।

    উদাহরণ:

    #[ORM\OneToMany(mappedBy: 'category', targetEntity: Product::class)]
    private $products;
    
  2. ManyToOne সম্পর্ক: একটি Entity একাধিক রেকর্ডের সাথে সম্পর্কিত, তবে অন্য Entity শুধুমাত্র একটির সাথে সম্পর্কিত।

    উদাহরণ:

    #[ORM\ManyToOne(targetEntity: Category::class, inversedBy: 'products')]
    #[ORM\JoinColumn(nullable: false)]
    private $category;
    
  3. ManyToMany সম্পর্ক: দুটি Entity একে অপরের সাথে একাধিক রেকর্ডের মাধ্যমে সম্পর্কিত।

    উদাহরণ:

    #[ORM\ManyToMany(targetEntity: Tag::class, mappedBy: 'products')]
    private $tags;
    

Doctrine ORM এর সুবিধা

  1. ডাটাবেস অ্যাবস্ট্রাকশন:
    Doctrine ORM ডাটাবেস এবং PHP কোডের মধ্যে একটি অ্যাবস্ট্রাকশন লেয়ার প্রদান করে, যার ফলে ডেভেলপারদের ডাটাবেসে ম্যানুয়ালি কোড লিখতে হয় না।
  2. সরাসরি SQL কোড লেখার প্রয়োজন নেই:
    Doctrine PHP অবজেক্টের মাধ্যমে ডেটা ম্যানিপুলেট করার সুযোগ প্রদান করে, তাই SQL কোড লেখার প্রয়োজন হয় না।
  3. সম্পর্ক ব্যবস্থাপনা:
    Doctrine ORM সহজেই বিভিন্ন ধরনের সম্পর্ক (OneToMany, ManyToOne, ManyToMany) পরিচালনা করতে পারে।
  4. ডাটাবেস নিরপেক্ষতা:
    Doctrine ডাটাবেস নিরপেক্ষ এবং আপনি যেকোনো ধরনের ডাটাবেস ব্যবহার করতে পারেন, যেমন MySQL, PostgreSQL, SQLite, ইত্যাদি।

সারাংশ

Doctrine ORM Symfony-তে ডাটাবেসের সাথে কাজ করার জন্য একটি শক্তিশালী টুল। এটি ডেটা পরিচালনা, মডেল তৈরি এবং ডাটাবেস সম্পর্কগুলি সহজে এবং কার্যকরভাবে করতে সাহায্য করে। Doctrine ORM ব্যবহার করলে ডেভেলপাররা PHP অবজেক্টের মাধ্যমে ডাটাবেসের সাথে কাজ করতে পারেন, যা তাদের কোডকে আরও পরিষ্কার এবং মডুলার করে তোলে।

Content added By

Symfony-তে ডেটাবেজ কানেকশন কনফিগারেশন খুবই গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনকে ডাটাবেসের সাথে সংযুক্ত করতে সাহায্য করে। Symfony ডাটাবেস কানেকশন কনফিগারেশনের জন্য Doctrine ORM ব্যবহার করে, যা ডাটাবেস পরিচালনার জন্য একটি শক্তিশালী এবং সহজ উপায়।

এখানে Symfony-তে ডেটাবেজ কানেকশন কনফিগার করার প্রক্রিয়া বর্ণনা করা হলো।


Doctrine ORM ইনস্টলেশন

Symfony-তে Doctrine ORM ব্যবহার করতে প্রথমে আপনাকে এটি ইনস্টল করতে হবে। Doctrine ORM Symfony-তে ডেটাবেস পরিচালনার জন্য ব্যবহৃত হয়।

Doctrine ইনস্টল করতে Composer ব্যবহার করুন:

composer require symfony/orm-pack

এটি Doctrine ORM এবং তার প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করবে, যেমন doctrine/dbal (ডেটাবেস অ্যাবস্ট্রাকশন লেয়ার) এবং doctrine/orm (অবজেক্ট-রিলেশনাল ম্যাপিং)।


ডেটাবেজ কানেকশন কনফিগারেশন

Symfony-তে ডেটাবেজ কানেকশন কনফিগার করার জন্য .env ফাইল বা .env.local ফাইল ব্যবহার করা হয়, যেখানে ডেটাবেসের URL নির্ধারণ করা হয়।

.env ফাইল কনফিগারেশন

  1. .env ফাইলটি খুলুন: Symfony প্রজেক্টের রুট ডিরেক্টরিতে .env ফাইলটি থাকবে। এটি আপনার ডেটাবেস কনফিগারেশন সংরক্ষণ করার জন্য ব্যবহৃত হয়।
  2. ডেটাবেজ URL সেট করুন: .env ফাইলে ডেটাবেজ URL এর মতো কনফিগারেশন যুক্ত করুন।

    উদাহরণ:

    DATABASE_URL="mysql://username:password@127.0.0.1:3306/db_name?serverVersion=5.7"
    

    এখানে:

    • username: ডেটাবেসের ব্যবহারকারীর নাম।
    • password: ডেটাবেসের পাসওয়ার্ড।
    • 127.0.0.1: ডাটাবেস সার্ভারের আইপি ঠিকানা (লোকালহোস্ট হলে এটি 127.0.0.1 হবে)।
    • 3306: ডেটাবেসের পোর্ট (MySQL-এর জন্য ডিফল্ট পোর্ট 3306)।
    • db_name: ডেটাবেসের নাম।
    • serverVersion: ডেটাবেসের সংস্করণ (যেমন, MySQL 5.7)।

.env.local ফাইল ব্যবহার

প্রোডাকশন পরিবেশে .env ফাইলের পরিবর্তে আপনি .env.local ফাইল ব্যবহার করতে পারেন, যা আপনার লোকাল কনফিগারেশন ধারণ করবে এবং ভার্সন কন্ট্রোল থেকে বাদ পড়বে। .env.local ফাইলে একই ডেটাবেজ URL কনফিগার করতে পারেন।

DATABASE_URL="mysql://username:password@127.0.0.1:3306/db_name?serverVersion=5.7"

Doctrine Configuration ফাইল

Doctrine কনফিগারেশন ডিফল্টভাবে config/packages/doctrine.yaml ফাইলে থাকে। এটি Symfony অ্যাপ্লিকেশনটির ডেটাবেস সংযোগ পরিচালনা করে।

doctrine.yaml কনফিগারেশন উদাহরণ

# config/packages/doctrine.yaml
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        driver: 'pdo_mysql'
        server_version: '5.7'
        charset: utf8mb4
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true

এখানে:

  • dbal.url: %env(resolve:DATABASE_URL)% ব্যবহার করে .env ফাইল থেকে ডেটাবেজ URL লোড করা হচ্ছে।
  • driver: ডেটাবেজের ড্রাইভার (যেমন pdo_mysql MySQL জন্য)।
  • server_version: ডেটাবেসের সংস্করণ, এটি MySQL 5.7 হিসেবে কনফিগার করা হয়েছে।
  • charset: ডেটাবেজের ক্যারেক্টার সেট।

ডেটাবেজ তৈরি এবং মাইগ্রেশন

  1. ডেটাবেজ তৈরি করুন: Symfony Doctrine আপনাকে ডেটাবেজ তৈরি করতে সাহায্য করে। নিচের কমান্ড ব্যবহার করুন:

    php bin/console doctrine:database:create
    

    এটি ডেটাবেজের URL কনফিগারেশন অনুযায়ী ডেটাবেজ তৈরি করবে।

  2. মাইগ্রেশন তৈরি করুন: ডেটাবেসের schema তৈরি করতে Doctrine মাইগ্রেশন ব্যবহার করতে পারেন। প্রথমে মাইগ্রেশন তৈরি করুন:

    php bin/console make:migration
    

    এটি একটি নতুন মাইগ্রেশন ফাইল তৈরি করবে, যা ডেটাবেসের স্কিমা পরিবর্তনগুলো সঠিকভাবে পরিচালনা করবে।

  3. মাইগ্রেশন চালান: মাইগ্রেশন প্রয়োগ করতে নিচের কমান্ড ব্যবহার করুন:

    php bin/console doctrine:migrations:migrate
    

    এটি ডেটাবেসে মাইগ্রেশনগুলি চালাবে এবং নতুন টেবিল বা কলাম তৈরি করবে।


Doctrine ORM ব্যবহার

Doctrine ORM ব্যবহার করে আপনি PHP অবজেক্টের মাধ্যমে ডেটাবেস পরিচালনা করতে পারবেন। উদাহরণস্বরূপ, একটি Product entity তৈরি করা:

// src/Entity/Product.php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string', length: 100)]
    private $name;

    public function getId(): int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }
}

এই Product entity তৈরি করার পরে, Doctrine ORM এর মাধ্যমে ডেটাবেসে এটি সংরক্ষণ এবং রিট্রিভ করা যাবে।


সারাংশ

Symfony-তে ডেটাবেজ কানেকশন কনফিগারেশন সহজ এবং স্বয়ংক্রিয়ভাবে পরিচালিত হয়। Doctrine ORM ব্যবহার করে ডেটাবেসের সাথে সংযোগ স্থাপন করা, ডেটা ম্যানিপুলেশন করা এবং মাইগ্রেশন পরিচালনা করা সম্ভব। .env এবং doctrine.yaml ফাইলের মাধ্যমে ডেটাবেজ কনফিগারেশন করা হয় এবং Symfony CLI-এর মাধ্যমে ডেটাবেজ তৈরি ও মাইগ্রেশন কার্যক্রম পরিচালনা করা যায়।

Content added By

Symfony-এর Entities হল ক্লাস যা ডাটাবেসের টেবিল এর প্রতিনিধিত্ব করে। Symfony Doctrine ORM (Object-Relational Mapping) ব্যবহার করে, যার মাধ্যমে PHP অবজেক্টগুলোকে ডাটাবেস টেবিলের রেকর্ডে রূপান্তর করা হয়। এটি ডেটাবেসের সাথে কাজ করার জন্য একটি সহজ এবং প্রভাবশালী উপায় সরবরাহ করে।

এখানে Symfony-তে Entities তৈরি ও ম্যাপিং করার প্রক্রিয়া আলোচনা করা হয়েছে।


Entities কী?

Entity হল একটি PHP ক্লাস যা ডাটাবেস টেবিল বা ভিউ-এর সাথে সম্পর্কিত। এটি ডেটাবেসের রেকর্ড বা রো গুলোর প্রতিনিধিত্ব করে এবং Doctrine ORM এটি ব্যবহার করে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করে।

Doctrine ORM (Object-Relational Mapping):

Doctrine ORM Symfony-তে ডাটাবেসের জন্য ব্যবহৃত একটি শক্তিশালী টুল। এটি PHP অবজেক্টগুলোকে ডাটাবেস টেবিলের রেকর্ডের সাথে মেলাতে সাহায্য করে এবং SQL কোড লেখার প্রয়োজন কমায়।

Doctrine-এ Entity সাধারণত একটি ক্লাস এবং এতে কিছু প্রপার্টি (fields) থাকে, যেগুলি ডাটাবেসের টেবিলের কলামের সাথে মেলে। Entity ক্লাসে Annotation বা XML/YAML কনফিগারেশন ব্যবহার করে ডাটাবেসের সাথে সম্পর্ক তৈরি করা হয়।


Symfony-তে Entity তৈরি করার প্রক্রিয়া

Symfony-তে Entity তৈরি করার জন্য make:entity কমান্ড ব্যবহার করা হয়।

Step 1: Entity তৈরি করা

Symfony CLI ব্যবহার করে নতুন Entity তৈরি করা:

php bin/console make:entity

এটি আপনাকে প্রশ্ন করবে:

  1. Entity এর নাম (যেমন: Product, User)
  2. Entity-তে ফিল্ড নাম এবং ধরন (যেমন: string, integer, date, boolean)

উদাহরণ:

php bin/console make:entity

Entity Name (e.g. Product): Product

New field name (press to stop adding fields): name

Field type (enter ? to see all types) [string]: string

Field length [255]: 100

এটি একটি Product Entity তৈরি করবে, যা name ফিল্ড ধারণ করবে এবং এটি string টাইপ হবে।

Step 2: Entity ক্লাস তৈরি

Entity ক্লাসটি src/Entity ডিরেক্টরিতে তৈরি হয়। উদাহরণস্বরূপ, যদি আপনি Product Entity তৈরি করেন, এটি দেখতে এমন হবে:

// src/Entity/Product.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $name;

    // Getter and Setter methods
    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }
}
  • @ORM\Entity: এই অ্যনোটেশনটি Doctrine কে জানায় যে এটি একটি Entity এবং এটি ডাটাবেস টেবিলের সাথে সম্পর্কিত।
  • @ORM\Column: প্রতিটি প্রপার্টির জন্য এই অ্যনোটেশনটি কলামের ধরণ এবং বৈশিষ্ট্য নির্ধারণ করে। উদাহরণস্বরূপ, name প্রপার্টি string ধরনের কলাম হবে।
  • @ORM\Id এবং @ORM\GeneratedValue: এই অ্যনোটেশনগুলি id প্রপার্টি সিলেক্ট করে এবং এটিকে প্রধান কী (Primary Key) হিসেবে চিহ্নিত করে।

Step 3: ডাটাবেস মাইগ্রেশন (Database Migration)

Entity তৈরি করার পর, ডাটাবেসে টেবিলের জন্য মাইগ্রেশন তৈরি এবং প্রয়োগ করতে হয়। Symfony Doctrine-এর জন্য Doctrine Migrations সরবরাহ করে, যা ডাটাবেসের কাঠামো পরিচালনা করতে সহায়ক।

মাইগ্রেশন তৈরি করা:

php bin/console make:migration

এটি আপনার Entity থেকে ডাটাবেস মাইগ্রেশন ফাইল তৈরি করবে।

মাইগ্রেশন প্রয়োগ করা:

php bin/console doctrine:migrations:migrate

এটি তৈরি করা মাইগ্রেশন প্রয়োগ করবে এবং ডাটাবেসে Product টেবিল তৈরি করবে।


Entities ম্যাপিং (Mapping) এবং সম্পর্ক

Doctrine ORM Entities এর মধ্যে সম্পর্ক তৈরি করার জন্য অনেক ধরনের ম্যাপিং সমর্থন করে। কিছু সাধারণ সম্পর্কের উদাহরণ:

  1. One-to-One (এক-এক সম্পর্ক)
  2. One-to-Many (এক-many সম্পর্ক)
  3. Many-to-Many (many-many সম্পর্ক)

One-to-Many সম্পর্ক উদাহরণ:

এখানে, Product Entity এবং Category Entity এর মধ্যে One-to-Many সম্পর্ক তৈরি করা হচ্ছে।

// src/Entity/Category.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
 */
class Category
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Product", mappedBy="category")
     */
    private $products;
    
    // Getter and Setter methods
}
// src/Entity/Product.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    // Other fields...

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Category", inversedBy="products")
     * @ORM\JoinColumn(nullable=false)
     */
    private $category;

    // Getter and Setter methods
}

এখানে:

  • @ORM\ManyToOne: Product Entity-কে Category Entity এর সাথে যুক্ত করছে। অর্থাৎ, একাধিক Product একটি Category এর অন্তর্গত হতে পারে।
  • @ORM\OneToMany: Category Entity-এ একাধিক Product থাকতে পারে।

Conclusion

Symfony-তে Entity তৈরি এবং ম্যাপিং একটি গুরুত্বপূর্ণ প্রক্রিয়া যা Doctrine ORM ব্যবহার করে ডাটাবেস টেবিলের সাথে PHP ক্লাসের সম্পর্ক তৈরি করে। এটি Model-View-Controller (MVC) ডিজাইন প্যাটার্নের অংশ হিসেবে ডাটাবেস পরিচালনা এবং কার্যকর ডেটা ইন্টারঅ্যাকশন সহজ করে তোলে। Entity তৈরি করার পর migrations ব্যবহার করে ডাটাবেসের কাঠামো পরিবর্তন করা যায় এবং এর মাধ্যমে ডাটাবেসের ডেটা সুরক্ষিতভাবে সংরক্ষিত ও পরিচালিত হয়।

Content added By

Symfony একটি শক্তিশালী Doctrine ORM ব্যবহার করে ডেটাবেস অপারেশন পরিচালনা করে। Doctrine ORM (Object-Relational Mapping) Symfony অ্যাপ্লিকেশনের ডেটাবেসের সাথে অবজেক্টগুলো সংযুক্ত করে, যাতে আপনি সহজে ডেটা সংরক্ষণ, সংশোধন এবং পুনরুদ্ধার করতে পারেন। Repository ক্লাস এই ডেটাবেস অপারেশনগুলো পরিচালনা করার জন্য ব্যবহৃত হয়।


Repository ক্লাস কী?

Repository ক্লাস হল একটি বিশেষ ক্লাস যা Doctrine ORM এর মাধ্যমে ডেটাবেসে Entity এর সাথে সম্পর্কিত কোয়েরি পরিচালনা করে। এটি মূলত ডেটাবেস থেকে ডেটা আনতে, আপডেট করতে, মুছতে এবং ইনসার্ট করার কাজ করে। Symfony-তে Repository ক্লাস src/Repository/ ডিরেক্টরিতে তৈরি করা হয় এবং এটি Entity ক্লাসের সাথে সম্পর্কিত থাকে।


Doctrine Repository ক্লাস তৈরি করা

Symfony-তে Repository ক্লাস তৈরি করতে, প্রথমে একটি Entity ক্লাস তৈরি করতে হয় এবং তারপর সেই Entity ক্লাসের জন্য Repository ক্লাস তৈরি করা হয়।

1. Entity ক্লাস তৈরি করা

ধরা যাক, আমরা একটি Product Entity তৈরি করছি যা ডেটাবেসে পণ্য সম্পর্কিত তথ্য সংরক্ষণ করবে।

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $name;

    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    private $price;

    // Getter and Setter methods
    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }

    public function getPrice(): ?float
    {
        return $this->price;
    }

    public function setPrice(float $price): self
    {
        $this->price = $price;
        return $this;
    }
}

এখানে Product Entity ক্লাসের জন্য repositoryClass হিসেবে App\Repository\ProductRepository ব্যবহার করা হয়েছে।


2. Repository ক্লাস তৈরি করা

প্রতিটি Entity-র জন্য একটি Repository ক্লাস তৈরি করা হয় যা ডেটাবেসের সাথে যোগাযোগের জন্য Doctrine-কে নির্দেশ দেয়। Symfony-এর CLI কমান্ড দিয়ে Repository ক্লাস তৈরি করা সহজ:

php bin/console make:repository ProductRepository

এটি src/Repository/ProductRepository.php ফাইলটি তৈরি করবে।

namespace App\Repository;

use App\Entity\Product;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method Product|null find($id, $lockMode = null, $lockVersion = null)
 * @method Product|null findOneBy(array $criteria, array $orderBy = null)
 * @method Product[]    findAll()
 * @method Product[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ProductRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Product::class);
    }

    // আপনি নিজস্ব কাস্টম কোয়েরি মেথড এখানে যোগ করতে পারেন
}

ProductRepository ক্লাসটি ServiceEntityRepository থেকে বংশধর, যা Doctrine-এর Entity ম্যানেজমেন্ট এবং ডেটাবেস অপারেশনগুলির জন্য একটি শক্তিশালী বেস ক্লাস।


Repository ক্লাসে কাস্টম কোয়েরি তৈরি করা

Doctrine Query Builder এবং DQL (Doctrine Query Language) ব্যবহার করে Repository ক্লাসে কাস্টম কোয়েরি তৈরি করা যায়।

1. Doctrine Query Builder ব্যবহার করা

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

namespace App\Repository;

use App\Entity\Product;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;

class ProductRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Product::class);
    }

    // একটি কাস্টম কোয়েরি যেটি পণ্য অনুসারে ডেটা ফেরত দেয়
    public function findByPriceRange(float $minPrice, float $maxPrice)
    {
        return $this->createQueryBuilder('p')
            ->andWhere('p.price >= :minPrice')
            ->andWhere('p.price <= :maxPrice')
            ->setParameter('minPrice', $minPrice)
            ->setParameter('maxPrice', $maxPrice)
            ->getQuery()
            ->getResult();
    }
}

এখানে findByPriceRange মেথডটি Doctrine Query Builder ব্যবহার করে পণ্যের মূল্য সীমার মধ্যে ডেটা খুঁজে বের করছে।

2. DQL (Doctrine Query Language) ব্যবহার করা

DQL ব্যবহার করে আপনি আরও জটিল কোয়েরি করতে পারেন। এটি SQL-এর মত, তবে এটি Doctrine ORM-এ ব্যবহৃত Entity ক্লাসের উপর কাজ করে।

public function findProductsByCategory(string $category)
{
    return $this->getEntityManager()
        ->createQuery(
            'SELECT p FROM App\Entity\Product p WHERE p.category = :category'
        )
        ->setParameter('category', $category)
        ->getResult();
}

এখানে DQL ব্যবহার করা হয়েছে, যা App\Entity\Product Entity থেকে পণ্য সংগ্রহ করছে যেখানে category নির্দিষ্ট মানের সমান।


Repository থেকে ডেটা রিটার্ন করা

Repository ক্লাসের মাধ্যমে ডেটা রিটার্ন করা হয়:

ডেটা রিটার্ন উদাহরণ

$products = $productRepository->findAll(); // সব পণ্য
$filteredProducts = $productRepository->findByPriceRange(50, 200); // মূল্য সীমার মধ্যে পণ্য

এই কোডটি ProductRepository থেকে ডেটা সংগ্রহ করে এবং findAll অথবা findByPriceRange মেথড ব্যবহার করে ফলাফল রিটার্ন করে।


কাস্টম কোয়েরি বা SQL ব্যবহার

যদি আপনি আরো জটিল SQL কোয়েরি ব্যবহার করতে চান, তবে Doctrine Native SQL ব্যবহার করতে পারেন:

public function findProductByNameUsingNativeSQL(string $name)
{
    $conn = $this->getEntityManager()->getConnection();
    $sql = 'SELECT * FROM product WHERE name = :name';
    $stmt = $conn->prepare($sql);
    $stmt->execute(['name' => $name]);

    return $stmt->fetchAllAssociative();
}

এখানে Native SQL ব্যবহৃত হয়েছে এবং পণ্য নাম অনুসারে SQL কোয়েরি করা হয়েছে।


সারাংশ

  • Repository ক্লাস Symfony এবং Doctrine ORM-এ ডেটাবেসের সাথে যোগাযোগ করার জন্য ব্যবহৃত হয়।
  • এটি DQL, Query Builder, এবং Native SQL ব্যবহার করে ডেটাবেসের উপর কাস্টম কোয়েরি তৈরি করতে সক্ষম।
  • Symfony-তে Entity এবং Repository-এর সংযোগ ডেটাবেসের জন্য কার্যকরী এবং সহজলভ্য ডেটা পরিচালনার সুবিধা দেয়।

Doctrine এবং Symfony Repository ক্লাস একত্রে ডেটাবেস অপারেশনগুলিকে মডুলার এবং সহজ করে তোলে, যা ডেভেলপারদের কাজকে অনেক সহজ করে তোলে।

Content added By

Symfony এবং Doctrine ORM (Object-Relational Mapping) ব্যবহারের মাধ্যমে একাধিক সম্পর্ক (OneToOne, OneToMany, ManyToMany) তৈরি এবং পরিচালনা করা সম্ভব। এই সম্পর্কগুলো ডাটাবেস টেবিলের মধ্যে একাধিক রেকর্ডের মধ্যে লিঙ্ক স্থাপন করে এবং অ্যাপ্লিকেশনের মধ্যে ডেটা পরিচালনাকে আরও সহজ করে তোলে।

Doctrine ORM এবং সম্পর্ক

Doctrine ORM Symfony-তে ডাটাবেস ম্যানিপুলেশনকে সহজ এবং অবজেক্ট-ওরিয়েন্টেড করে তোলে। Doctrine ব্যবহার করে আপনি এন্টিটিজি (Entities) তৈরি করে ডাটাবেসের টেবিলগুলির সাথে সম্পর্ক স্থাপন করতে পারেন।

Doctrine-এ সম্পর্কের মূল ধরণগুলি হল:

  1. OneToOne: একে অপরের সাথে সম্পর্কিত দুটি একক রেকর্ড।
  2. OneToMany: এক রেকর্ডের সাথে অনেক রেকর্ড সম্পর্কিত।
  3. ManyToMany: একাধিক রেকর্ড একে অপরের সাথে সম্পর্কিত।

OneToOne সম্পর্ক

OneToOne সম্পর্কের মাধ্যমে একটি রেকর্ড অন্য একটি রেকর্ডের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একজন ব্যবহারকারীর সাথে একটি প্রোফাইল সম্পর্কিত থাকতে পারে। এখানে একজন ব্যবহারকারীর শুধুমাত্র একটি প্রোফাইল থাকতে পারে এবং একটি প্রোফাইল শুধুমাত্র একটি ব্যবহারকারীর সাথে সম্পর্কিত।

এন্টিটি উদাহরণ:

User Entity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class User
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $name;

    #[ORM\OneToOne(targetEntity: 'Profile', mappedBy: 'user')]
    private $profile;

    public function getProfile(): ?Profile
    {
        return $this->profile;
    }

    public function setProfile(Profile $profile): self
    {
        $this->profile = $profile;
        return $this;
    }
}

Profile Entity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Profile
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $bio;

    #[ORM\OneToOne(targetEntity: 'User', inversedBy: 'profile')]
    #[ORM\JoinColumn(nullable: false)]
    private $user;

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(User $user): self
    {
        $this->user = $user;
        return $this;
    }
}

এখানে, User এন্টিটি একটি Profile এন্টিটির সাথে সম্পর্কিত এবং এটি mappedBy এবং inversedBy ব্যবহার করে OneToOne সম্পর্ক স্থাপন করেছে।


OneToMany সম্পর্ক

OneToMany সম্পর্কের মাধ্যমে একটি রেকর্ডের সাথে অনেক রেকর্ড সম্পর্কিত থাকে। উদাহরণস্বরূপ, একটি ব্লগ পোস্টের সাথে অনেক মন্তব্য থাকতে পারে, কিন্তু প্রতিটি মন্তব্য একটি নির্দিষ্ট ব্লগ পোস্টের সাথে সম্পর্কিত।

এন্টিটি উদাহরণ:

Post Entity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Post
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $title;

    #[ORM\OneToMany(targetEntity: 'Comment', mappedBy: 'post')]
    private $comments;

    public function __construct()
    {
        $this->comments = new ArrayCollection();
    }

    public function getComments(): Collection
    {
        return $this->comments;
    }
}

Comment Entity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Comment
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $content;

    #[ORM\ManyToOne(targetEntity: 'Post', inversedBy: 'comments')]
    #[ORM\JoinColumn(nullable: false)]
    private $post;

    public function getPost(): ?Post
    {
        return $this->post;
    }

    public function setPost(Post $post): self
    {
        $this->post = $post;
        return $this;
    }
}

এখানে, Post এন্টিটি Comment এন্টিটির সাথে OneToMany সম্পর্ক স্থাপন করেছে। এটি mappedBy এবং inversedBy এর মাধ্যমে সম্পর্ক স্থাপন করেছে। Comment এন্টিটি ManyToOne সম্পর্ক ব্যবহার করে Post এর সাথে যুক্ত।


ManyToMany সম্পর্ক

ManyToMany সম্পর্কের মাধ্যমে অনেক রেকর্ড একে অপরের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, অনেক ছাত্র বিভিন্ন কোর্সে রেজিস্টার করতে পারে এবং একটি কোর্সে অনেক ছাত্র থাকতে পারে।

এন্টিটি উদাহরণ:

Student Entity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Student
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $name;

    #[ORM\ManyToMany(targetEntity: 'Course', mappedBy: 'students')]
    private $courses;

    public function __construct()
    {
        $this->courses = new ArrayCollection();
    }

    public function getCourses(): Collection
    {
        return $this->courses;
    }
}

Course Entity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Course
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string')]
    private $title;

    #[ORM\ManyToMany(targetEntity: 'Student', inversedBy: 'courses')]
    #[ORM\JoinTable(name: 'student_courses')]
    private $students;

    public function __construct()
    {
        $this->students = new ArrayCollection();
    }

    public function getStudents(): Collection
    {
        return $this->students;
    }
}

এখানে, Student এবং Course এন্টিটি ManyToMany সম্পর্কের মধ্যে রয়েছে। Student অনেক Course-এ থাকতে পারে এবং Course-এ অনেক Student থাকতে পারে। এখানে JoinTable ব্যবহার করা হয়েছে, যা সম্পর্কিত টেবিলের জন্য একটি মিডিয়েটিং টেবিল তৈরি করে।


Doctrine মাইগ্রেশন

উপরোক্ত সম্পর্কগুলির মাধ্যমে, Doctrine ORM স্বয়ংক্রিয়ভাবে ডাটাবেস স্কিমার জন্য উপযুক্ত মাইগ্রেশন তৈরি করতে পারে।

মাইগ্রেশন তৈরি করা:

php bin/console make:migration

মাইগ্রেশন চালানো:

php bin/console doctrine:migrations:migrate

সারাংশ

Doctrine ORM Symfony-তে OneToOne, OneToMany, এবং ManyToMany সম্পর্ক ব্যবস্থাপনা সহজ করে তোলে। এই সম্পর্কগুলো ডাটাবেসের মধ্যে সম্পর্কিত টেবিলগুলির মধ্যে লিঙ্ক স্থাপন করে এবং ডেটা ব্যবস্থাপনাকে আরও কার্যকর ও মডুলার করে। Doctrine ব্যবহার করে আপনি সহজেই এসব সম্পর্ক নির্ধারণ করতে এবং ম্যানেজ করতে পারেন।

Content added By

Symfony-তে Doctrine ORM ব্যবহার করে ডাটাবেস মডেল এবং স্কিমা পরিচালনা করা হয়। Doctrine ORM Symfony-তে একটি শক্তিশালী এবং বহুমুখী ডাটাবেস অ্যাবস্ট্রাকশন লেয়ার (DBAL) সরবরাহ করে, যা ডাটাবেস মডেল তৈরি, আপডেট, এবং মাইগ্রেশন পরিচালনা করতে সাহায্য করে। Doctrine-এর মাধ্যমে আপনি ডাটাবেস স্কিমা পরিবর্তন এবং মাইগ্রেশন সহজেই পরিচালনা করতে পারবেন, যা প্রজেক্টের ডাটাবেস স্ট্রাকচার পরিবর্তন করতে সহায়ক।

এখানে Doctrine মাইগ্রেশন এবং স্কিমা আপডেট-এর ব্যবহারের পদ্ধতি বর্ণনা করা হলো।


Doctrine ORM এবং মাইগ্রেশন

Doctrine ORM Symfony-তে ডাটাবেস অপারেশন এবং স্কিমা পরিচালনার জন্য ব্যবহৃত হয়। Doctrine মাইগ্রেশন প্রক্রিয়া ডাটাবেস স্কিমার পরিবর্তন ট্র্যাক এবং পরিচালনা করতে সাহায্য করে।

Doctrine মাইগ্রেশন ইনস্টল করা

Doctrine মাইগ্রেশন ব্যবহারের জন্য প্রথমে Symfony প্রজেক্টে Doctrine মাইগ্রেশন প্যাকেজ ইনস্টল করতে হয়।

composer require doctrine/doctrine-migrations-bundle

এটি Doctrine-এর মাইগ্রেশন ব্যবস্থাপনা টুলটি আপনার Symfony প্রজেক্টে যুক্ত করবে।


মাইগ্রেশন তৈরি করা

Doctrine ORM ব্যবহারের মাধ্যমে, আপনি মডেল পরিবর্তন করার পরে মাইগ্রেশন তৈরি করতে পারেন, যা ডাটাবেসে এই পরিবর্তনগুলি আপডেট করবে। মাইগ্রেশন তৈরি করতে, নিচের কমান্ডটি ব্যবহার করুন:

php bin/console make:migration

এই কমান্ডটি Doctrine-এর বর্তমান মডেল এবং ডাটাবেসের মধ্যে পার্থক্য বিশ্লেষণ করে একটি মাইগ্রেশন ফাইল তৈরি করবে। এটি সাধারণত src/Migrations/ ডিরেক্টরিতে .php ফাইল হিসেবে তৈরি হয়।

উদাহরণ:

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

class Version20231208012345 extends AbstractMigration
{
    public function up(Schema $schema): void
    {
        // মাইগ্রেশন আপডেট: টেবিল তৈরি বা পরিবর্তন
        $this->addSql('CREATE TABLE product (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, price DOUBLE NOT NULL, PRIMARY KEY(id))');
    }

    public function down(Schema $schema): void
    {
        // মাইগ্রেশন রিভার্স: টেবিল ডিলিট
        $this->addSql('DROP TABLE product');
    }
}

এই ফাইলটি ডাটাবেসের স্কিমা পরিবর্তন করে, যেমন নতুন টেবিল তৈরি বা বিদ্যমান টেবিল মুছে ফেলতে পারে।


মাইগ্রেশন রান করা

মাইগ্রেশন ফাইল তৈরি করার পর, এটি ডাটাবেসে প্রয়োগ করতে migrate কমান্ড ব্যবহার করা হয়:

php bin/console doctrine:migrations:migrate

এটি সব মাইগ্রেশন ফাইল একে একে ডাটাবেসে প্রয়োগ করবে এবং ডাটাবেসের স্কিমা আপডেট করবে।

মাইগ্রেশন রান করার সময় কিছু বিষয়:

  • Doctrine একটি migration_versions টেবিল তৈরি করে, যেখানে এটি ট্র্যাক করে কোন মাইগ্রেশন ইতিমধ্যে রান করা হয়েছে।
  • এটি পূর্ববর্তী মাইগ্রেশনগুলির তুলনায় নতুন মাইগ্রেশন চালাতে সহায়ক।

ডাটাবেস স্কিমা আপডেট করা

ডাটাবেস মডেল পরিবর্তন করার পরে Doctrine এর মাধ্যমে স্কিমা আপডেট করা খুবই সহজ। সাধারণত, আপনি ডাটাবেস স্কিমা অটোমেটিকভাবে আপডেট করতে doctrine:schema:update কমান্ড ব্যবহার করতে পারেন।

php bin/console doctrine:schema:update --force

এটি আপনার মডেল অনুযায়ী ডাটাবেসের স্কিমা আপডেট করবে এবং নতুন টেবিল, কলাম, এবং সম্পর্ক তৈরি করবে।

--dry-run অপশন:

যদি আপনি আসল পরিবর্তনগুলি করার আগে পরীক্ষা করতে চান, তবে --dry-run অপশন ব্যবহার করে আপনি মাইগ্রেশন বা স্কিমা পরিবর্তনের প্রস্তাবিত পরিবর্তন দেখতে পারেন।

php bin/console doctrine:schema:update --dry-run

এটি কেবল স্কিমা আপডেটের জন্য কী পরিবর্তন করা হবে তা দেখাবে, কিন্তু আসল পরিবর্তন করবে না।


স্কিমা এবং মাইগ্রেশন ব্যবস্থাপনা

Doctrine স্কিমা এবং মাইগ্রেশন ব্যবস্থাপনা বেশ কয়েকটি ভিন্ন ধাপের মাধ্যমে পরিচালিত হয়, যেমন:

  • make:migration: ডাটাবেস মডেল পরিবর্তন ট্র্যাক করে মাইগ্রেশন তৈরি করা।
  • migrate: মাইগ্রেশন কার্যকর করা।
  • schema:update: ডাটাবেস স্কিমা সরাসরি আপডেট করা।

মাইগ্রেশন রিভার্স (Rollback):

যদি আপনি একটি মাইগ্রেশন রিভার্স (অথবা ফিরে যাওয়া) করতে চান, তখন doctrine:migrations:execute কমান্ড ব্যবহার করতে পারেন।

php bin/console doctrine:migrations:execute --down 20231208012345

এটি 20231208012345 নামক মাইগ্রেশনটি পূর্বের অবস্থায় ফিরিয়ে আনবে।


Doctrine মাইগ্রেশন এবং স্কিমা আপডেটের সুবিধা

  1. স্কেলেবিলিটি:
    Doctrine মাইগ্রেশন একটি বড় অ্যাপ্লিকেশনের জন্য ডাটাবেস পরিবর্তন সহজভাবে পরিচালনা করতে সহায়ক। এটি বড় অ্যাপ্লিকেশনগুলিতে দ্রুত এবং নিরাপদ স্কিমা আপডেট নিশ্চিত করে।
  2. স্বয়ংক্রিয় আপডেট:
    মডেল পরিবর্তন করলে Doctrine স্বয়ংক্রিয়ভাবে সেই পরিবর্তনগুলিকে ডাটাবেসে প্রয়োগ করতে সক্ষম।
  3. ডাটাবেস পরিবর্তন ট্র্যাকিং:
    Doctrine মাইগ্রেশন ডাটাবেসের সমস্ত পরিবর্তন সঠিকভাবে ট্র্যাক করে, যাতে ভবিষ্যতে সহজেই যেকোনো পরিবর্তন রিভার্স করা যায়।
  4. সহজ রিভার্সিবিলিটি:
    মাইগ্রেশন ফাইলের মধ্যে আপনি up() এবং down() মেথড ব্যবহার করে ডাটাবেস পরিবর্তন ফিরে আনতে পারেন।

উপসংহার

Doctrine ORM এবং Symfony-তে মাইগ্রেশন এবং স্কিমা আপডেট ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ, বিশেষ করে যখন প্রজেক্টের স্কেল বড় হয়। মাইগ্রেশন ব্যবস্থার মাধ্যমে আপনি ডাটাবেস পরিবর্তনগুলি ট্র্যাক করতে পারবেন এবং স্কিমা আপডেটের সময় ভুল এড়াতে পারবেন। Symfony-এর Doctrine মাইগ্রেশন এবং স্কিমা আপডেট কমান্ডগুলি ডাটাবেস পরিচালনার প্রক্রিয়াকে সহজ, নির্ভরযোগ্য এবং পরিচালনাযোগ্য করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...