Laravel Database Eloquent ORM
Laravel Has Relationships
লারাভেলে, “has” relationships দিয়ে একটি মডেলের মাধ্যমে অন্য এক বা একাধিক মডেলের ডেটা retrive retrive করতে পারি। আর এই “has” relationships তিন ধরণের:
- “Has One Of Many” Relationship
- “Has One Through” Relationship
- “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); });
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
আর উপরোক্ত টেবিল গুলোর রিলেশনশিপ হবে নিম্নরুপঃ
এবার চলুন উপরের প্রতিটি 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
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 করে।
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); });
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
আর উপরোক্ত টেবিল গুলোর রিলেশনশিপ হবে নিম্নরুপঃ
এবার চলুন উপরের প্রতিটি 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 } }
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); });