ল্যারাভেল এবং ডেটাবেজ মাইগ্রেশন

ল্যারাভেলে কিভাবে ডেটাবেজ যুক্ত করতে হয়, কিভাবে টেবিল যোগ করতে হয়, কিভাবে ফেইক ডেটা জেনারেট করতে হয় এ সম্পর্কে জানব এই লেখায়। লারাভেলে নিচের যে কোন ডেটাবেজ নিয়ে কাজ করা যায়ঃ

  • SQL Server
  • MariaDB
  • MySQL
  • PostgreSQL
  • SQLite

লারাভেলের সাথে ডিফল্ট ভাবে SQLite যুক্ত থাকে। আর ডেটাবেজ কনফিগারেশন থাকে প্রজেক্টের রুট ডিরেক্টরির .env ফাইলে। আমরা চাইলে যে কোন সময় যে কোন ডেটাবেজ ব্যবহার কতে পারি। শুধু মাত্র এই .env ফাইলে কনফিগারেশন পরিবর্তন করে। ডিফল্ট ভাবে এভাবে দেখবঃ

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

আমরা যখন laravel new example-app অথবা হার্ড ব্যবহার করে ল্যারাভেল প্রজেক্ট তৈরি করি তখন অটোমেটিক SQLite ডেটাবেজ তৈরি হয়ে যায়। আমরা জানি SQLite হচ্ছে ফাইল বেইজড ডেটাবেজ। যা তৈরি হয় প্রজেক্টের database ডিরেক্টরিতে, database.sqlite নামে। SQLite ডেটাবেজ দেখার জন্য গুলো টুল রয়েছে। সবচেয়ে সিম্পল ট্যুল হচ্ছে DB Browser for SQLite। এছাড়া ভিজুয়াল স্টুডিও কোডের জন্য SQLite Viewer এক্সটেনশন রয়েছে।

এবার দেখি কিভাবে MySQL যুক্ত করা যায়।  ডেটাবেজ যুক্ত করার জন্য আমাদের কম্পিউটারে MySQL ইন্সটল করতে হবে। WAMP, XAMP বা ম্যানুয়ালি ইন্সটল করতে পারেন। তবে WAMP, XAMP এর মত ট্যুল গুলোতে পিএইচপি, MySQL ইত্যাদি প্যাকেজ আকারে থাকে। আরেকটা দরকারি টুল থাকে, phpMyAdmin। যার মাধ্যমে আমরা ডেটাবেজ তৈরি, ডেটাবেজের ডেটা ব্রাউয সহ যে কোন কিছু করতে পারি। এসব নিয়ে বিস্তারিত আরেকটা লেখাঃ সার্ভার সম্পর্কে ধারণা, wamp সার্ভার ইন্সটল এবং ব্যবহার। এ ছাড়া আরেকটা লেখা রয়েছে phpMyAdmin এ MySQL ডেটাবেজ ম্যানেজমেন্ট নিয়ে। ব্যাসিক এই জ্ঞান গুলো আশা করি আমাদের ল্যারাভেল শিখতে কাজে দিবে।

লারাভেলে ডেটাবেজ হিসেবে মাইএসকিউএল সেট করার জন্য প্রথমে phpMyAdmin বা যেভাবে পারেন ঐভাবে একটা ডেটাবেজ তৈরি করে নিতে হবে। এরপর .env ফাইলে ডেটাবেজের নাম, ইউজারনেম, পাসওয়ার্ড ইত্যাদি দিতে হবে। যেমনঃ

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_db_name
DB_USERNAME=root
DB_PASSWORD=

ডিফল্ট ভাবে পোর্ট 3306 থাকে। এবং ইউজারনেম থাকে root এবং কোন পাসওয়ার্ড থাকে না। যদি MySQL এ পাসওয়ার্ড দিয়ে থাকেন, তা এখানে দিতে হবে।

আপনি চাইলে কমান্ডলাইনও ব্যবহার করতে পারেন। কমান্ড লাইন ব্যবহার করে MySQL ডেটাবেজ তৈরি করতে চাইলে আপনাকে  mysql এর পাথ উইন্ডোজের এর Environment variable এ যুক্ত করতে হবে। আপনি wamp ব্যবহার করলে mysql এর পাথ হবে এমনঃ C:\wamp\bin\mysql\mysql6.x.x\bin। লিনাক্স এবং ম্যাকের ক্ষেত্রে ব্যাস বা .zshrc ফাইলে পাথ যুক্ত করতে হবে।

কমান্ড লাইনে ডেটাবেজ তৈরি করার জন্য প্রথমে user name এবং password দিয়ে mysqal এ লগিন করতে হবে। যেমন আমরা root ব্যবহারকারী হিসেবে লগিন করার জন্যঃ

mysql -uroot -p


এরপর ডেটাবেজ তৈরি করার জন্যঃ

create database database-name;

উপরের কমান্ড ব্যবহার আপনার দেওয়া নামে ডেটাবেজ তৈরি হবে।

এই ডেটাবেজে কোয়েরি আমরা কমান্ডলাইন দিয়ে করতে পারি। তার জন্য প্রথমে কোন ডেটাবেজে কোয়েরি করব, তা সিলেক্ট করতে হবে। তার জন্যঃ

mysql use database-name

এরপর আমরা যে কোন SQL কমান্ড ব্যবহার করতে পারব। SQL এর ব্যাসিক জানার জন্যঃ বাংলায় ডেটাবেজ টিউটোরিয়াল – SQL

কমান্ডলাইন ব্যবহার করে ডেটাবেজ তৈরি করলেও কাজ করবে আবার phpMyAdmin ব্যবহার করে ডেটাবেজ তৈরি করলেও কাজ করবে। phpMyAdmin এ একটা বাড়তি সুবিধে হচ্ছে ডেটাবেজের টেবিল এবং কন্টেন্ট ভিজুয়ালি দেখা যায় এবং এডিট বা যুক্ত করা যায়।এগুলো ছিল ডেটাবেজ নিয়ে ব্যাসিক ধারণা। আমরা চাইলে যে কোন ডেটাবেজই ব্যবহার করতে পারি। ল্যারাভেল যথেষ্ঠ স্মার্ট। আমাদের সেইম কোড যে কোন ডেটাবেজে কাজ করবে। তবে বেশির ভাগ কাজ SQLite দিয়েই করা সম্ভব।

ইনিশিয়ালি ল্যারাভেল ডেটাবেজে কিছু টেবিল যুক্ত করে। যেমন cache, migrartion, jobs ইত্যাদি।

 ডেটাবেজ মাইগ্রেশন

phpMyAdmin বা কমান্ডলাইনের মাধ্যমে ডেটাবেজে আমরা টেবিল, কলাম, ডেটা ইত্যাদি যোগ করতে পারি। আবার আমরা চাইলে প্রোগ্রামাটিক্যালিও টেবিল তৈরি করতে পারি। টেবিল তৈরি করার জন্য যে কোড গুলো লেখা হয়, সাধারণত এই কোড গুলোকে বলা হয় স্কিমা। যেমনঃ

        Schema::create('users', function (Blueprint $table) {
            $table->string('name');
            $table->string('email')->unique();
}

উপরের স্কিমা দিয়ে আমরা .env ফাইলে কনফিগার করা ডেটাবেজে user নামে টেবিল তৈরি করতে পারব। যার মধ্যে name এবং email নামে দুইটা কলাম তৈরি হবে। ডিফল্ট ভাবে ল্যারাভেলে কয়েকটি স্কিমা তৈরি করা থাকে। যেগুলো পাওয়া যাবে project>database>migrations ফোল্ডারের ভেতর। আমরা যদি ...create_users_table.php ফাইল খুলে দেখি, তাহলে দেখব উপরের কোডের মত স্কিমা তৈরি করা রয়েছে। এই স্কিমা অনুযায়ী ডেটাবেজে টেবিল তৈরি করার জন্য ল্যারাভেল কমান্ড রয়েছে। যাকে বলে মাইগ্রেশন।

কমান্ড লাইনে আমাদের প্রজেক্ট ডিরেক্টরিতে যাই। এরপর নিচের কমান্ড লিখিঃ

php artisan migrate

উপরের কমান্ড যদি রান করি, তাহলে দেখব ডেটাবেজে কিছু টেবিল যুক্ত হয়েছে। যে ডেটাবেজ ব্যবহার করছেন, ঐ ডেটাবেজ ভিউয়ারে দেখতে পারেন এর টেবিল গুলো। এরপর user টেবিলের সাথে ...create_users_table.php ফাইল মিলিয়ে দেখুন।

    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

        Schema::create('password_reset_tokens', function (Blueprint $table) {
            $table->string('email')->primary();
            $table->string('token');
            $table->timestamp('created_at')->nullable();
        });

        Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->foreignId('user_id')->nullable()->index();
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->longText('payload');
            $table->integer('last_activity')->index();
        });
    }

...create_users_table.php ফাইলে দেখব তিনটা টেবিল users, password_reset_tokens, sessions তৈরি করার স্কিমা লেখা রয়েছে। এই অনুযায়ী ডাটাবেজে তিনটা টেবিল এবং প্রতিটা টেবিলে স্কিমা অনুযায়ী কলাম তৈরি হবে।

টার্মিনাল থেকে ডেটাবেজ টেবিল দেখা

php artisan db:show

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

উপরে আমরা ডিফল্ট ইউজার মাইগেশন দেখেছি। আমরা চাইলে নিজেদের প্রয়োজন মত মাইগ্রেশন ফাইল তৈরি করে নিতে পারি। যেমন ধরি আমরা একটা নোট অ্যাপ তৈরি করছি। যেখানে note নামে একটা টেবিল তৈরি করব। এর জন্য প্রথমে একটা মাইগ্রেশন ফাইল তৈরি করে নিব project>database>migrations ফোল্ডারের ভেতর। যেমন নাম দিলাম create_notes_table। কমান্ড লাইনের মাধ্যমেও করতে পারিঃ

php artisan make:migration create_notes_table

কমান্ড লাইনে তৈরি করলে আজকের তারিখ এবং একটা আইডি যুক্ত করবব এমনঃ 2024_07_30_041144_create_notes_table.php। যার ভেতর ডিফল্ট কিছু কোড লেখা থাকবেঃ

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('notes', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('notes');
    }
};

এখানে notes টেবিলের জন্য দুইটা ডিফল্ট কলাম তৈরি করা রয়েছে

            $table->id();
            $table->timestamps();

আমরা title এবং note আরো দুইটা কলাম যোগ করিঃ

        Schema::create('notes', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->longText('note');
            $table->timestamps();
        });
    }

এবার যদি মাইগ্রেশন কমাড রান করি, তাহলে দেখব ডেটাবেজে notes নামে একটা টেবিল তৈরি হয়েছে। যার মধ্যে id, title, note এবং টাইমস্ট্যাম্পের দুইটা সহ মোট ৫টা কলাম তৈরি হয়েছে।

php artisan migrate

দারুণ না?

ল্যারাভেলের ডেটাবেজ মাইগ্রেশনের দারুণ কিছু ফিচার রয়েছে। যেমন উপরে দেখেছি কিভাবে স্কিমা অনুযায়ী টেবিল এবং কলাম তৈরি করে। এছাড়া মাইগ্রেশনের ভার্সন কন্ট্রোল ট্র্যাক করে। একই মাইগ্রেশন বার বার রান করে না। এছাড়া একই প্রজেক্টের একাধিক ডেভেলপমেন্ট এনভারনমেন্টের মধ্যে কনসিস্টেন্সি বজায় রাখে।

মাইগ্রেশন কমান্ডের অন্যান্য ফিচার গুলোঃ

  • মাইগ্রেশনের স্ট্যাটাস দেখতে পারি php artisan migrate:status কমান্ডের মাধ্যমে।
  • পূর্ববর্তী মাইগ্রেশনে ফিরে যেতে php artisan migrate:rollback কমান্ড ব্যবহার করতে পারি।
  • সব গুলো টেবিল ডিলেট করে পুনরায় মাইগ্রেশন করতে use php artisan migrate:fresh কমান্ড ব্যবহার করতে পারি।
  • সব গুলো টেবিল রিসেট করে পুনরায় মাইগ্রেশনের জন্য php artisan migrate:refresh কমান্ড ব্যবহার করতে পারি। এই ক্ষেত্রে টেবিল ডিলেট হবে না।

টেবিল তৈরি করার পর আমরা ডেটাবেজে ডেটা স্টোর করতে প্রস্তুত।

ডেটাবেজ সিড

রিয়েল প্রজেক্টে সাধারণত ইউজার বা আমরা ডেটা গুলো ইউজার ম্যানুয়ালি ইনপুট দিব। কিন্তু ডেভেলপমেন্টের সময় টেস্টিং ও ডেভেলপমেন্টের সাহায্যের জন্য আমাদের ডামি ডেটা লাগে। ল্যারাভেল এই কথা মাথায় রেখে ফেইক ডেটা তৈরি করার অপশন রেখেছে। যাকে বলে সিডিং।

সিডারঃ ল্যারাভেলে ডামি ডেটা জেনারেট করার জন্য ক্লাসকে সিডার বলা হয়। ডিফল্ট ভাবে ডামি ইউজার তৈরির জন্য একটা সিডার ক্লাস তৈরি করা থাকে। যা পাওয়া যাবে project> database > seeders যার মূল কোড হচ্ছে এমনঃ

   public function run(): void
    {
        // User::factory(10)->create();

        User::factory()->create([
            'id' => 1,
            'name' => 'Test User',
            'email' => '[email protected]',
            'password'=> bcrypt('pass123'),
        ]);
    }

উপরের সিডার ক্লাস দিয়ে বলা হচ্ছে একটা ইউজার তৈরি করতে। সিড করার কমান্ডঃ

php artisan db:seed

উপরের কমান্ড রান করলে আমরা দেখব ডেটাবেজে ইউজার টেবিলে একটা ইউজার তৈরি হয়েছে। একটা ইউজার তৈরি করার জন্য আমরা এর প্রোপার্টি গুলো একটা একটা করে ইনপুট দিতে হয়েছে। যদি ১০টা বা ১০০টা ইউজার তৈরি করতে চাই, সব গুলো ইনপুট দিতে কেমন বিশ্রী হবে না? এটার সমাধানও রয়েছে লারাভেলে। আগে একশন দেখি, তারপর বিস্তারিত জানব। User::factory(10)->create(); কোড আনকমেন্ড করে বাকি অংশ রিমুভ করিঃ

public function run(): void
    {
        User::factory(10)->create();
    }

এবার আবার সিড কমান্ড রান করিঃ

php artisan db:seed

এখন যদি ডেটাবেজে যাই, দেখব 10টা নতুন ইউজার তৈরি হয়েছে। ১০০টা ইউজার তৈরি করতে লিখব User::factory(100)->create()। ইন্টারেস্টিং। তাই না?

উপরে আমাদের জন্য অটোমেটিক ১০০টা ডামি ইউজার প্রোভাইড করেছে ইউজার ফ্যাক্টরি। ইউজার ফ্যাক্টরিকে আমাদের শুধু বলতে হয়েছে কয়টা ইউজার লাগবে। বাকিটা সে তৈরি করে দিয়েছে। আর এই ইউজার ফ্যাক্টরি রয়েছে project> database > factories ফোল্ডারে UserFactory.php নামে। এই ফাইল খুললে দেখবঃ

    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => static::$password ??= Hash::make('password'),
            'remember_token' => Str::random(10),
        ];
    }

যা দিয়ে আমাদেরকে ফেইক নাম, ইমেইল ইত্যাদি রিটার্ণ করেছে।

উপরে আমরা ল্যারাভেল ডিফল্ট ইউজার ফ্যাক্টরি ব্যবহার করেছি। আমরা চাইলে নিজেদের প্রয়োজন মত ফ্যাক্টরি তৈরি করে নিতে পারি। যেমন NoteFactory তৈরি করব আমরা। এর আগে নোট মডেল তৈরি করা না থাকলে একটা মডেল তৈরি করে নিবঃ

php artisan make:model Note

এরপর ফ্যাক্টরি তৈরি করবঃ

php artisan make:factory NoteFactory --model=Note

যা আমাদের ফাইল তৈরি করে দিবে। ফ্যাক্টরি ফোল্ডারে NoteFactory.php ফাইল তৈরি করে দিবে। ফাইলটি ওপেন করে definition মেথডে ফেইক টাইটেল এবং নোট জেনারেট করার জন্য নিচের মত করে লিখবঃ

    public function definition(): array
    {
        return [
            'id' => 1,
            'title' => $this->faker->sentence(),
            'note' => fake()->realText(2000)

        ];
    }

ফেইক note তৈরি করার জন্য note’ => $this->faker->paragraph() ও ব্যবহার করতে পারি।

create_notes_table.php ফাইলের স্কিমা আবার দেখিঃ

  public function up(): void
    {
        Schema::create('notes', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->longText('note');
            $table->timestamps();
        });
    }

DatabaseSeeder.php ফাইলে ইউজারের পাশাপাশি ফেইক নোট তৈরি করার কোড যোগ করিঃ

    public function run(): void
    {
        User::factory(10)->create();

        Note::factory(100)->create();
    }

এবার ডেটাবেজ সিড কমান্ড রান করিঃ

php artisan db:seed

আমরা দেখব ডেটাবেজে ১০০টা ফেইক নোট তৈরি হয়েছে।

এক সাথে সব গুলো ফাইল তৈরি

উপরে আমরা আলাদা আলাদা করে ফ্যাক্টরি, সিডার, মাইগ্রেশন টেবিল ইত্যাদি ফাইল তৈরি করেছি। আমরা চাইলে মডেল তৈরির সময় একই সাথে সব গুলো ফাইল তৈরি করে নিতে পারি। তার জন্য লিখবঃ

php artisan make:model ModelName --all

তাহলে আমাদের জন্য দরকারি সব গুলো ফাইল তৈরি হয়ে যাবে। যেমনঃ

  • app/Models/ModelName.php
  • database/factories/ModelNameFactory.php
  • database/migrations/…_create_model_names_table.php
  • database/seeders/ModelNameSeeder.php
  • app/Http/Requests/StoreModelNameRequest.php
  • app/Http/Requests/UpdateModelNameRequest.php
  • app/Http/Controllers/ModelNameController.php
  • app/Policies/ModelNamePolicy.php

এগুলো সবই আমাদের একটা রিয়েল প্রজেক্ট তৈরির সময় কাজে লাগবে। যা আমরা সামনের লেখা গুলোতে জানতে পারব। ল্যারাভেল নিয়ে সব গুলো লেখা।

1 thought on “ল্যারাভেল এবং ডেটাবেজ মাইগ্রেশন”

  1. লারাভেলে নাকি টেবিল নেম প্লুরাল বা s যুক্ত করতে হয়। এখন আমার এক্সিস্টিং এ্যাপলিকেশনকে লারাভেলে রূপান্তর করতে গেলে কিভাবে করব?

    Reply

Leave a Reply