Laravel Has Relationships

লারাভেলে, “has” relationships দিয়ে একটি মডেলের মাধ্যমে অন্য এক বা একাধিক মডেলের ডেটা retrive retrive করতে পারি। আর এই “has” relationships তিন ধরণের:

  1. “Has One Of Many” Relationship
  2. “Has One Through” Relationship
  3. “Has Many Through” Relationship

Laravel “Has One Of Many” Relationships কি?

কখনও কখনও একটি মডেলের অনেক related models থাকতে পারে, তবুও আপনি relationship গুলোর “latest” বা “oldest” related মডেলটি সহজেই retrieve করতে চান। উদাহরণস্বরূপ, একটি User model অনেকগুলি Post model এর সাথে related হতে পারে, তবে আপনি ইউজারের দেওয়া সাম্প্রতিকতম Post টির সাথে ইন্টারঅ্যাক্ট করার একটি সুবিধাজনক উপায় নির্ধারণ করতে চান৷ আপনি ofMany-এর সাথে hasOne relationship টাইপ ব্যবহার করে এটি সম্পন্ন করতে পারেন।

সহজ করে বললে Has One Of Many relationships এর মাধ্যমে আপনি most recent অর্থাৎ সাম্প্রতিকতম বা most oldest অর্থাৎ সবচেয়ে পুরানো মডেল retrieve করার সহজ উপায় প্রদান করে।

আমাদের ইতিমধ্যে database/migrations ডিরেক্টরিতে আমাদের ইতিমধ্যেই users migrations class রয়েছে, তাই আমাদের শুধুমাত্র নিম্নলিখিত কমান্ড দিয়ে posts migration তৈরি করতে হবে:

php artisan make:migration create_posts_table

posts migration এ, আমরা নিম্নলিখিত fields গুলি ডিফাইন করেছি:

<?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('posts', function (Blueprint $table) {
            $table->id();
            $table->integer('user_id')->unsigned();
            $table->string('title');
            $table->integer('views');
            $table->boolean('body');
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

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

এইবার নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে posts table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

এইবার আমাদেরকে একটা Post নামে Model তৈরি করতে হবে। নিম্নোক্ত কমান্ডের মাধ্যমে Post Model টি তৈরি করে ফেলুন :

php artisan make:model Post

এইবার posts table এর জন্য কিছু dummy ডাটা তৈরি করতে হবে। আর তার জন্য আমরা একটা seeder তৈরি করব। নিম্নোক্ত কমান্ডের মাধ্যমে Post table এর জন্য একটি seeder file তৈরি করে ফেলুন :

php artisan make:seed PostsTableSeeder

এবার সদ্য তৈরি হওয়া PostsTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Post;

class PostsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // Create sample posts
        $posts = [
            [
                'title' => 'First Post',
                'views' => 100,
                'body' => true,
                'user_id' => 1,
            ],
            [
                'title' => 'Second Post',
                'views' => 200,
                'body' => false,
                'user_id' => 1,
            ],
            [
                'title' => 'Third Post',
                'views' => 150,
                'body' => true,
                'user_id' => 2,
            ],
            // Add more sample posts as needed
        ];

        // Insert the posts into the database
        foreach ($posts as $post) {
            Post::create($post);
        }
    }
}

এইবার posts টেবিল এর জন্য সদ্য তৈরি করা seed File কে নিম্নোক্ত কমান্ডের মাধ্যমে রান করুন :

php artisan db:seed --class=PostsTableSeeder

আপনার Laravel application টিতে ইতিমধ্যেই User model রয়েছে। এখন User model টি তে latestPost() method টি ডিফাইন করুন যা ofMany method সাথে মিলিত একটি relationship ধরন রিটার্ন দেবে:

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;




class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    
    /**
     * Get the latest post associated with the user.
     */
    public function latestPost():HasOne
    {
        return $this->hasOne(Post::class)->latestOfMany();
    }

    /**
    * Get the oldest post associated with the user.
    */
    public function oldestPost():HasOne
    {
        return $this->hasOne(Post::class)->oldestOfMany();
    }

    /**
     * Get the user's popular post.
     */
    public function popularPost()
    {
        return $this->hasOne(Post::class)->ofMany('views', 'max');
    }
  

}

মোটামুটি মডেলের কাজ শেষ , এবার আপনার route এ নিম্নোক্ত code লিখে Has One Of Many Relationship চেক করতে পারেন :

use App\Models\Post;

Route::get('/get-posts',function(){
    $post = User::find(1)->latestPost;
    //$post = User::find(1)->oldestPost;
   // $post = User::find(1)->popularPost;

    dd($post);
});

Mastering Laravel with ReactJS Course

Laravel “Has One Through” Relationships কি?

Laravel Has One Through Relationships
Laravel Has One Through Relationships

লারাভেলের Eloquent relationship system এ , “Has One Through” relationship হচ্ছে আপনাকে এমন একটি relationship কে সংজ্ঞায়িত করতে দেয় যা অন্য মধ্যবর্তী মডেলের মধ্য দিয়ে যাওয়া জড়িত। আপনি যখন তৃতীয় মডেলের মাধ্যমে পরোক্ষভাবে একটি related model এ অ্যাক্সেস করতে চান তখন এই relationship টি কার্যকর।

যাইহোক, এই relationship টি নির্দেশ করে যে declaring model টি তৃতীয় মডেলের মাধ্যমে অন্য মডেলের একটি instance এর সাথে matched হতে পারে।

একদম সহজ করে বললে এক মডেল থেকে অন্য মডেলের ডেটা এক্সেস করার জন্য তৃতীয় একটি মডেলের সাহায্য নেওয়া।

উদাহরণস্বরূপ, একটি vehicle repair shop application এর কথা বলা যায়, প্রতিটি Mechanic model একটি Car model এর সাথে যুক্ত হতে পারে এবং প্রতিটি Car model একটি Owner model এর সাথে যুক্ত হতে পারে। যদিও mechanic এবং owner ডাটাবেসের মধ্যে কোনো সরাসরি relationship নেই, তবে mechanic Model চাইলে Car model এর মাধ্যমে owner মডেল কে অ্যাক্সেস করতে পারে। আসুন এই relationship টি সংজ্ঞায়িত করার জন্য প্রয়োজনীয় টেবিলগুলি দেখি:

mechanics
    id - integer
    name - string
 
cars
    id - integer
    model - string
    mechanic_id - integer
 
owners
    id - integer
    name - string
    car_id - integer

আর উপরোক্ত টেবিল গুলোর রিলেশনশিপ হবে নিম্নরুপঃ

Laravel Has One Through Relationship
Laravel Has One Through Relationship

এবার চলুন উপরের প্রতিটি Table Structure এর জন্য তাদের Migration এবং Model File গুলো তৈরি করে ফেলি:

Migration: CreateMechanicsTable

আপনি নিম্নলিখিত কমান্ড ব্যবহার করে mechanics table তৈরি করতে একটি migration file তৈরি করতে পারেন:

php artisan make:migration create_mechanics_table --create=mechanics

তারপর, generated migration ফাইলটি খুলুন এবং up method এ নিম্নরূপ পরিবর্তন করুন:

<?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('mechanics', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

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

একইসাথে নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে mechanics table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

Migration: CreateCarsTable

একইভাবে, নিম্নলিখিত কমান্ড ব্যবহার করে cars table তৈরি করতে একটি migration file তৈরি করুন:

php artisan make:migration create_cars_table --create=cars

তারপর, generated migration ফাইলটি খুলুন এবং up method এ নিম্নরূপ পরিবর্তন করুন:

<?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('cars', function (Blueprint $table) {
            $table->id();
            $table->string('model');
            $table->unsignedBigInteger('mechanic_id');
            $table->timestamps();
            $table->foreign('mechanic_id')->references('id')->on('mechanics');
        });
    }

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

একইসাথে নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে cars table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

Mastering Laravel with ReactJS Course

Migration: CreateOwnersTable

একইভাবে, নিম্নলিখিত কমান্ড ব্যবহার করে owners table তৈরি করতে একটি migration file তৈরি করুন:

php artisan make:migration create_owners_table --create=owners

তারপর, generated migration ফাইলটি খুলুন এবং up method এ নিম্নরূপ পরিবর্তন করুন:

<?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('owners', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->unsignedBigInteger('car_id');
            $table->timestamps();
            $table->foreign('car_id')->references('id')->on('cars');
        });
    }

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

একইসাথে নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে owners table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

এবার চলুন প্রতিটি টেবিল এর জন্য একটি করে Model File এবং তাদের প্রয়োজনীয় Relationship তৈরি করে ফেলি :

Model: Car.php

নিম্নলিখিত কমান্ডটি চালিয়ে Car model ফাইল তৈরি করুন:

php artisan make:model Car

Model: Owner.php

নিম্নলিখিত কমান্ডটি চালিয়ে Owner model ফাইল তৈরি করুন:

php artisan make:model Owner

Model: Mechanic.php

নিম্নলিখিত কমান্ডটি চালিয়ে Car model ফাইল তৈরি করুন:

php artisan make:model Mechanic

এবার চলুন প্রতিটি টেবিল এর জন্য নিম্নোক্ত Seeder File তৈরি করে ফেলি :

MechanicsTableSeeder.php

নিম্নলিখিত কমান্ডটি চালিয়ে mechanics Table এর জন্য seeder ফাইল তৈরি করুন:

php artisan make:seeder MechanicsTableSeeder

এবার সদ্য তৈরি হওয়া MechanicsTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Mechanic;

class MechanicsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        {
            Mechanic::create(['name' => 'John Doe']);
            Mechanic::create(['name' => 'Jane Smith']);
            // Add more mechanics as needed
        }
    }
}

CarsTableSeeder.php

নিম্নলিখিত কমান্ডটি চালিয়ে cars Table এর জন্য seeder ফাইল তৈরি করুন:

php artisan make:seeder CarsTableSeeder

এবার সদ্য তৈরি হওয়া CarsTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Car;

class CarsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        Car::create(['model' => 'Toyota Camry', 'mechanic_id' => 1]);
        Car::create(['model' => 'Honda Civic', 'mechanic_id' => 2]);
        // Add more cars as needed
    }
}

OwnersTableSeeder.php

নিম্নলিখিত কমান্ডটি চালিয়ে owners Table এর জন্য seeder ফাইল তৈরি করুন:

php artisan make:seeder OwnersTableSeeder

এবার সদ্য তৈরি হওয়া OwnersTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Owner;

class OwnersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        Owner::create(['name' => 'John Smith', 'car_id' => 1]);
        Owner::create(['name' => 'Jane Doe', 'car_id' => 2]);
        // Add more owners as needed
    }
}

Update DatabaseSeeder.php File

এবার সব গুলো seed File রান করার জন্য আপনার seeder ফোল্ডারে অবস্থিত DatabaseSeeder.php ফাইলে নিচের মতো করে আমাদের seeder File টি যুক্ত করে দিন :

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call(MechanicSeeder::class);
        $this->call(CarSeeder::class);
        $this->call(OwnerSeeder::class);
    }
}

এবার seeders গুলি চালাতে এবং ডেটা সহ টেবিলগুলি পূরণ করতে, আপনি নিম্নলিখিত কমান্ডটি চালাতে পারেন:

php artisan db:seed

Update your Mechanic Model

ডেটাবেসের টেবিল গুলোতে স্যাম্পল ডেটা ইন্সার্ট করা শেষ এবার প্রথমে আপনার Mechanic Model কে নিচের মতো করে পরিবর্তন করে নিন :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;

class Mechanic extends Model
{
    use HasFactory;

    public function car():HasOne
    {
        return $this->hasOne(Car::class);
    }

    public function owner():HasOneThrough
    {
        return $this->hasOneThrough(
            Owner::class,
            Car::class
        );
    }
}

Mechanic মডেলে, আমরা একটি hasOne relationship সংজ্ঞায়িত করি যার নাম car() যা Mechanic কে Car Model এর সাথে connects করে এবং একটি hasOneThrough relationship নামে owner() যা Mechanic কে Car মডেলের মাধ্যমে Owner এর সাথে connects করে।

Mastering Laravel with ReactJS Course

Update your Car Model

এবার আপনার Car Model কে নিচের মতো করে পরিবর্তন করে নিন :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Car extends Model
{
    use HasFactory;

    public function mechanic():BelongsTo
    {
        return $this->belongsTo(Mechanic::class);
    }

    public function owner():HasOne
    {
        return $this->hasOne(Owner::class);
    }
}

Car model এ , আমরা mechanic() নামের একটি belongsTo relationship কে সংজ্ঞায়িত করি যা Car model কে Mechanic Model এর সাথে connect করে, এবং একটি hasOne relationship যা owner() Method এর মাধ্যমে Car Model কে Owner Model এর সাথে সংযুক্ত করে।

Update your Owner Model

এবার আপনার Owner Model কে নিচের মতো করে পরিবর্তন করে নিন :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;

class Owner extends Model
{
    use HasFactory;
    public function car():BelongsTo
    {
        return $this->belongsTo(Car::class);
    }

    public function mechanic():HasOneThrough
    {
        return $this->hasOneThrough(Mechanic::class, Car::class);
    }
}

Owner মডেলে, আমরা car() এর মাধ্যমে একটি belongsTo relationship কে সংজ্ঞায়িত করি যা Owner Model কে Car Model এর সাথে connect করে এবং একটি hasOneThrough relationship যা mechanic() এর মাধ্যমে Car মডেলের মাধ্যমে Owner কে Mechanic এর সাথে সংযুক্ত করে।

মোটামুটি মডেলের কাজ শেষ , এবার আপনার route এ নিম্নোক্ত code লিখে HasOneThrough Relationship চেক করতে পারেন :

use App\Models\Mechanic;
use App\Models\Owner;

Route::get('/get-mechanic',function(){
   /*  $mechanics=Mechanic::get();
    foreach($mechanics as $mechanic){
        echo $mechanic->owner->name,"<br>";
    } */
    //dd(Mechanic::find(1)->owner);
    //dd(Mechanic::find(1)->car->model);
    dd(Owner::find(1)->car->model);
});

Mastering Laravel with ReactJS Course

Laravel “Has Many Through” Relationships কি?

লারাভেলের Eloquent relationship system এ , “Has Many Through” relationship অনেকটা “Has One Through” relationship এর মতোই যা আপনাকে মধ্যবর্তী মডেলের মাধ্যমে অন্য অনেকগুলো Model এর সাথে Relationship করার সুযোগ দেয়। আপনি যখন তৃতীয় মডেলের মাধ্যমে পরোক্ষভাবে অনেক গুলো related model এ অ্যাক্সেস করতে চান তখন এই relationship টি কার্যকর।

যাইহোক, এই relationship টি নির্দেশ করে যে declaring model টি তৃতীয় মডেলের মাধ্যমে অন্য অনেক গুলো মডেলের একটি instance এর সাথে matched হতে পারে।

একদম সহজ করে বললে এক মডেল থেকে অন্য অনেক গুলো মডেলের ডেটা এক্সেস করার জন্য তৃতীয় একটি মডেলের সাহায্য নেওয়া।

উদাহরণস্বরূপ, ধরা যাক আমরা Laravel Vapor মতো একটি deployment platform তৈরি করছি। একটি Project model একটি মধ্যবর্তী Environment model এর মাধ্যমে অনেক Deployment model এ অ্যাক্সেস করতে পারে। এই উদাহরণ ব্যবহার করে, আপনি সহজেই একটি প্রদত্ত প্রকল্পের জন্য সমস্ত deployments গুলো সংগ্রহ করতে পারেন। চলুন এই relationship টি সংজ্ঞায়িত করার পূর্বে প্রয়োজনীয় টেবিলগুলি দেখুন:

projects
    id - integer
    name - string
 
environments
    id - integer
    project_id - integer
    name - string
 
deployments
    id - integer
    environment_id - integer
    commit_hash - string

আর উপরোক্ত টেবিল গুলোর রিলেশনশিপ হবে নিম্নরুপঃ

Laravel Has Many Through Relationship
Laravel Has Many Through Relationship

এবার চলুন উপরের প্রতিটি Table Structure এর জন্য তাদের Migration এবং Model File গুলো তৈরি করে ফেলি:

Migration: CreateProjectsTable

আপনি নিম্নলিখিত কমান্ড ব্যবহার করে projects table তৈরি করতে একটি migration file তৈরি করতে পারেন:

php artisan make:migration CreateProjectsTable

তারপর, generated migration ফাইলটি খুলুন এবং up method এ নিম্নরূপ পরিবর্তন করুন:

<?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('projects', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

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

একইসাথে নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে projects table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

Migration: CreateEnvironmentsTable

আপনি নিম্নলিখিত কমান্ড ব্যবহার করে environments table তৈরি করতে একটি migration file তৈরি করতে পারেন:

php artisan make:migration CreateEnvironmentsTable

তারপর, generated migration ফাইলটি খুলুন এবং up method এ নিম্নরূপ পরিবর্তন করুন:

<?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('environments', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('project_id');
            $table->foreign('project_id')->references('id')->on('projects');
            $table->string('name');
            $table->timestamps();
        });
    }

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

একইসাথে নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে environments table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

Migration: CreateDeploymentsTable

আপনি নিম্নলিখিত কমান্ড ব্যবহার করে deployments table তৈরি করতে একটি migration file তৈরি করতে পারেন:

php artisan make:migration CreateDeploymentsTable

তারপর, generated migration ফাইলটি খুলুন এবং up method এ নিম্নরূপ পরিবর্তন করুন:

<?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('deployments', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('environment_id');
            $table->foreign('environment_id')->references('id')->on('environments');
            $table->string('commit_hash');
            $table->timestamps();
        });
    }

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

একইসাথে নিম্নোক্ত কমান্ডের মাধ্যমে উক্ত মাইগ্রেশন ফাইলের মাধ্যমে deployments table টি তৈরি করে ফেলুন :

php artisan migrate --path=/database/migrations/your_migration_file.php

এবার চলুন প্রতিটি টেবিল এর জন্য একটি করে Model File এবং তাদের প্রয়োজনীয় Relationship তৈরি করে ফেলি :

Model: Project.php

নিম্নলিখিত কমান্ডটি চালিয়ে Project model ফাইল তৈরি করুন:

php artisan make:model Project

Model: Environment.php

নিম্নলিখিত কমান্ডটি চালিয়ে Environment model ফাইল তৈরি করুন:

php artisan make:model Environment 

Model: Deployment.php

নিম্নলিখিত কমান্ডটি চালিয়ে Deployment model ফাইল তৈরি করুন:

php artisan make:model Deployment

এবার চলুন প্রতিটি টেবিল এর জন্য নিম্নোক্ত Seeder File তৈরি করে ফেলি :

ProjectsTableSeeder.php

নিম্নলিখিত কমান্ডটি চালিয়ে projects Table এর জন্য seeder ফাইল তৈরি করুন:

php artisan make:seeder ProjectsTableSeeder

এবার সদ্য তৈরি হওয়া ProjectsTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Project;

class ProjectsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
         // Clear existing records
         Project::truncate();

         // Seed projects
         Project::create([
             'name' => 'Project 1',
         ]);
 
         Project::create([
             'name' => 'Project 2',
         ]);

         Project::create([
            'name' => 'Project 3',
        ]);
 +-
         // Add more projects as needed
    }
}

Mastering Laravel with ReactJS Course

EnvironmentsTableSeeder.php

নিম্নলিখিত কমান্ডটি চালিয়ে environments Table এর জন্য seeder ফাইল তৈরি করুন:

php artisan make:seeder EnvironmentsTableSeeder

এবার সদ্য তৈরি হওয়া EnvironmentsTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Environment;

class EnvironmentsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
         // Clear existing records
         Environment::truncate();

         // Seed environments
         Environment::create([
             'project_id' => 1,
             'name' => 'Environment 1',
         ]);
 
         Environment::create([
             'project_id' => 1,
             'name' => 'Environment 2',
         ]);

         Environment::create([
            'project_id' => 2,
            'name' => 'Environment 3',
        ]);

        Environment::create([
            'project_id' => 2,
            'name' => 'Environment 4',
        ]);
 
         // Add more environments as needed
    }
}

DeploymentsTableSeeder.php

নিম্নলিখিত কমান্ডটি চালিয়ে deployments Table এর জন্য seeder ফাইল তৈরি করুন:

php artisan make:seeder DeploymentsTableSeeder

এবার সদ্য তৈরি হওয়া DeploymentsTableSeeder ফাইল টিকে নিচের মতো আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Deployment;

class DeploymentsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
             // Clear existing records
     Deployment::truncate();

     // Seed deployments
     Deployment::create([
         'environment_id' => 1,
         'commit_hash' => 'abc123',
     ]);

     Deployment::create([
         'environment_id' => 1,
         'commit_hash' => 'def456',
     ]);

     Deployment::create([
            'environment_id' => 3,
            'commit_hash' => 'fgh123',
     ]);
   
     Deployment::create([
            'environment_id' => 3,
            'commit_hash' => 'igk456',
     ]);

     // Add more deployments as needed
    }
}


Update DatabaseSeeder.php File

এবার সব গুলো seed File রান করার জন্য আপনার seeder ফোল্ডারে অবস্থিত DatabaseSeeder.php ফাইলে নিচের মতো করে আমাদের seeder File টি যুক্ত করে দিন :

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call(ProjectsTableSeeder::class);
        $this->call(EnvironmentsTableSeeder::class);
        $this->call(DeploymentsTableSeeder::class);
    }
}

এবার seeders গুলি চালাতে এবং ডেটা সহ টেবিলগুলি পূরণ করতে, আপনি নিম্নলিখিত কমান্ডটি চালাতে পারেন:

php artisan db:seed

Update your Project Model

ডেটাবেসের টেবিল গুলোতে স্যাম্পল ডেটা ইন্সার্ট করা শেষ এবার প্রথমে আপনার Project Model কে নিচের মতো করে পরিবর্তন করে নিন :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Project extends Model
{
    use HasFactory;

     /**
     * Get all of the deployments for the project.
     */
    public function deployments(): HasManyThrough
    {
        return $this->hasManyThrough(Deployment::class, Environment::class);
    }

     /**
     * Get the environments for the project.
     */
    public function environments(): HasMany
    {
        return $this->hasMany(Environment::class);
    }

}


মোটামুটি মডেলের কাজ শেষ , এবার আপনার route এ নিম্নোক্ত code লিখে HasManyThrough Relationship চেক করতে পারেন :

use App\Models\Project;

Route::get('/projects/{project}', function (Project $project) {
    // Retrieve the deployments for the project
    $deployments = $project->deployments;

    dd($deployments);
});

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply