Laravel Database Eloquent ORM
Eloquent Basics
ORM কি?
ORM যা মূলত Object-Relational Mapping এর সংক্ষিপ্ত রূপ। এটি এমন একটি কৌশল যা ডেভেলপারদের একটি object-oriented programming Method ব্যবহার করে relational database এর সাথে যোগাযোগ করতে দেয়।
সাধারণত, ডেভেলপারদেরকে ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য বিভিন্ন ধরণের SQL query গুলো লিখতে হয়, যা সময়সাপেক্ষ এবং এবং অনেক ভুল থাকতে পারে। একটি ORM-এর সাহায্যে, ডেভেলপাররা তাদের পছন্দের programming language এর object গুলোর সাথে কাজ করতে পারে। আরো সহজ করে বললে ORM object ডেভেলপারদের এবং তাদের ডাটাবেসের মধ্যে ট্রান্সলেটর এর ভূমিকা পালন করে।
মূলতঃ ORM গুলি application code এবং database এর মধ্যে একটি abstraction layer প্রদান করে, যা কোড লেখা এবং বজায় রাখা সহজ করে তোলে। ORM গুলি ডেভেলপারদের low-level database details যেমন table সমূহ, columns এবং SQL statements এর সাথে কাজ করার পরিবর্তে objects এবং class গুলোর মতো high-level abstractions নিয়ে কাজ করার অনুমতি দেয়।
ORM গুলো সাধারণত database query, data insert, update এবং delete করা এবং Table গুলোর মধ্যে relationships manage করার জন্য ফাঙ্কশনালিটি প্রদান করে। এগুলি প্রায়শই caching, ডাটাবেস migrations এবং schema management এর মতো features গুলি অন্তর্ভুক্ত করে।
সামগ্রিকভাবে, ORM ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজনীয় repetitive code এর পরিমাণ হ্রাস করে এবং ডেটার সাথে কাজ করার আরও সহজ উপায় প্রদান করে database-driven application গুলির development কে সহজ করতে পারে।
Laravel Framework এ Eloquent কি?
Laravel Eloquent হল Laravel Framework এর একটি Object-Relational Mapping (ORM) system যা PHP PDO (PHP Data Objects) library এর উপরে নির্মিত। যা ডাটাবেসের সাথে কাজ করার জন্য একটি সহজ, সাবলীল syntax তৈরির সুবিধা প্রদান করে, যা ডেভেলপারদের raw SQL Query গুলো লেখার পরিবর্তে PHP কোড ব্যবহার করে ডাটাবেস টেবিল এবং রেকর্ডের সাথে কাজ করার সুযোগ দেয়।
Laravel Eloquent ব্যবহার করে, ডেভেলপাররা প্রতিটি ডাটাবেস টেবিলের জন্য একটি Model class ডিফাইন করে, যা সেই টেবিলে এর রেকর্ড গুলো রিপ্রেজেন্ট করে। এছাড়াও Model গুলি টেবিলের মধ্যে relationships গুলিকে ডিফাইন করে এবং querying, inserting, updating এবং রেকর্ডগুলি deleting এর মতো কাজ গুলো করার জন্য methods গুলির একটি সেট প্রদান করে।
Laravel Eloquent database operation গুলোর একটি বিস্তৃত ব্যবহার সমর্থন করে, যার মধ্যে eager loading, lazy loading এবং dynamic attribute handling. এছাড়াও soft deletes এর মতো features গুলিও রয়েছে, যেখানে রেকর্ডগুলিকে ডাটাবেস থেকে physically delete করার পরিবর্তে delete হিসাবে চিহ্নিত করা যায় এবং সংবেদনশীল ডেটার accidental modification রোধ করতে mass assignment protection দেয়।
Laravel Eloquent-এর প্রধান সুবিধাগুলির মধ্যে একটি হল এর একটি fluent interface এর ব্যবহার, যা ডেভেলপারদেরকে জটিল queries তৈরি করতে একত্রে chain method কল করতে দেয়। এর ফলে আরও readable এবং maintainable কোড, সেইসাথে development times কে faster করে।
সামগ্রিকভাবে, Eloquent হল একটি শক্তিশালী ORM system যা লারাভেলে ডাটাবেসের সাথে কাজ করা সহজ করে, যা ডেভেলপারদের জন্য efficient, secure এবং maintainable কোড লেখা সহজ করে তোলে।
Laravel Framework এ Model কি?
লারাভেলে, একটি Model হল একটি class যা একটি ডাটাবেস টেবিলের represent করে। এটি ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে এবং বিভিন্ন ডাটাবেস-সম্পর্কিত অপারেশন্স যেমন টেবিল থেকে বিদ্যমান ডেটা বের করে আনা, নতুন রেকর্ড ইনসার্ট করা, রেকর্ড আপডেট করা এবং এবং বিদ্যমান রেকর্ড মুছে ফেলার জন্য ব্যবহৃত হয়।
একটি Model class সাধারণত Illuminate\Database\Eloquent\Model class থেকে extends করে, যা ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য বিভিন্ন methods প্রদান করে। প্রতিটি Model একটি একক ডাটাবেস টেবিলের প্রতিনিধিত্ব করে এবং এর properties গুলি সেই টেবিলের কলামগুলিকে represent করে।
আপনি যখন একটি নতুন Model তৈরি করেন, তখন আপনি এটি যে টেবিলের প্রতিনিধিত্ব করে তার নামের সাথে মিলিয়ে নামটি ডিফাইন করেন এবং লারাভেল স্বয়ংক্রিয়ভাবে ক্লাসের নামের উপর ভিত্তি করে টেবিলের নামটি ধরে নেবে (ক্লাসের নামটিকে camel case থেকে snake case এ রূপান্তর করবে এবং বহুবচন করবে)।
উদাহরণস্বরূপ, যদি আপনার কাছে User নামে একটি মডেল থাকে, তাহলে লারাভেল ধরে নেবে যে টেবিলের নামটি হবে users। এছাড়াও আপনিmodel class এ একটি protected $table property তে ডিফাইন করে একটি custom table এর নামও ডিফাইন করতে পারেন।
Model গুলি অন্যান্য Model এর সাথে relationships ও ডিফাইন করতে পারে, যা আপনাকে সহজেই related data বের করে নিয়ে আসতে দেয়। লারাভেল দ্বারা সমর্থিত বিভিন্ন ধরনের relationships রয়েছে, যার মধ্যে one-to-one, one-to-many, many-to-many, এবং polymorphic relationships সম্পর্ক রয়েছে।
Generating Model Classes
Laravel Framework এ Model গুলি সাধারণত app\Models ডিরেক্টরিতে থাকে এবং Illuminate\Database\Eloquent\Model ক্লাস extend করা হয়। আপনি একটি নতুন Model তৈরি করতে make:model Artisan command ব্যবহার করতে পারেন:
php artisan make:model Flight
আপনি যদি Model টি তৈরি করার সময়, একটি database migration তৈরি করতে চান, তাহলে আপনি –migration বা -m option টি ব্যবহার করতে পারেন:
php artisan make:model Flight --migration
এছাড়াও একটি Model তৈরি করার সময় আপনি বিভিন্ন ধরণের class গুলো তৈরি করতে পারেন, যেমন factories, seeders, policies, controllers এবং form requests. উপরন্তু, এই options গুলি একসাথে একাধিক class তৈরি করতে একত্রিত করে ব্যবহার করতে পারেন:
# Generate a model and a FlightFactory class... php artisan make:model Flight --factory php artisan make:model Flight -f # Generate a model and a FlightSeeder class... php artisan make:model Flight --seed php artisan make:model Flight -s # Generate a model and a FlightController class... php artisan make:model Flight --controller php artisan make:model Flight -c # Generate a model, FlightController resource class, and form request classes... php artisan make:model Flight --controller --resource --requests php artisan make:model Flight -crR # Generate a model and a FlightPolicy class... php artisan make:model Flight --policy # Generate a model and a migration, factory, seeder, and controller... php artisan make:model Flight -mfsc # Shortcut to generate a model, migration, factory, seeder, policy, controller, and form requests... php artisan make:model Flight --all # Generate a pivot model... php artisan make:model Member --pivot
Inspecting Models
কখনও কখনও শুধুমাত্র পর্যালোচনা করে একটি মডেলের ব্যবহৃত সমস্ত attributes এবং attributes নির্ধারণ করা কঠিন হতে পারে। বরং কোড পর্যালোচনা করার পরিবর্তে,model:show Artisan command টি রান করুন, যা মডেলের সমস্ত attributes এবং relations এর একটি সুবিধাজনক ওভারভিউ প্রদান করে:
php artisan model:show Flight
Eloquent Model Conventions
Laravel Framework এ make:model কমান্ড দ্বারা মডেলগুলি তৈরি করা হয় এবং app/Models directory তে থাকে। আসুন একটি basic model class পরীক্ষা করি এবং Eloquent এর কিছু key conventions নিয়ে আলোচনা করি:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Flight extends Model { // ... }
Table Names
উপরের উদাহরণের দিকে নজর দেওয়ার পরে, আপনি হয়তো লক্ষ্য করেছেন যে আমরা Eloquent কে বলিনি যে, কোন database table আমাদের Flight মডেলের সাথে কাজ করবে। নিয়ম অনুসারে, “snake case”, ক্লাসের বহুবচন নাম টেবিলের নাম হিসাবে ব্যবহার করা হবে যদি না অন্য নাম স্পষ্টভাবে নির্দিষ্ট করা হয়। সুতরাং, এই ক্ষেত্রে, Eloquent ধরে নেবে Flight model টি flights table এ রেকর্ড সংরক্ষণ করে, যখন একটি AirTrafficController model একটি air_traffic_controllers টেবিলে রেকর্ড সংরক্ষণ করবে।
যদি আপনার মডেলের সংশ্লিষ্ট database table এই কনভেনশনের সাথে খাপ না খায় , তাহলে আপনি মডেলটিতে ম্যানুয়ালি মডেলের টেবিলের নাম একটি table property নির্দিষ্ট করতে পারেন:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The table associated with the model. * * @var string */ protected $table = 'my_flights'; }
Primary Keys
Eloquent এও অনুমান করবে যে প্রতিটি মডেলের সংশ্লিষ্ট ডাটাবেস টেবিলে id নামে একটি primary key column রয়েছে। প্রয়োজনে, আপনি আপনার মডেলে primary key column এর জন্য একটি ভিন্ন কলাম নির্দিষ্ট করতে পারেন। যা আপনার মডেলের প্রাথমিক কী হিসাবে কাজ করবে। আর এর জন্য protected $primaryKey property সংজ্ঞায়িত করতে পারেন :
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The primary key associated with the table. * * @var string */ protected $primaryKey = 'flight_id'; }
উপরন্তু, Eloquent অনুমান করে যে primary key টি একটি incrementing integer value, যার মানে হল Eloquent স্বয়ংক্রিয়ভাবে একটি integer এ primary key টি cast করবে। আপনি যদি একটি non-incrementing বা একটি non-numeric primary key ব্যবহার করতে চান তবে আপনাকে অবশ্যই আপনার মডেলে একটি public $incrementing property সংজ্ঞায়িত করতে হবে যার value হিসেবে false সেট করতে হবে:
<?php class Flight extends Model { /** * Indicates if the model's ID is auto-incrementing. * * @var bool */ public $incrementing = false; }
আপনার মডেলের primary key একটি integer না হলে, আপনার মডেলে একটি protected $keyType property ডিফাইন করা উচিত। এই property এর value থাকবে string:
<?php class Flight extends Model { /** * The data type of the auto-incrementing ID. * * @var string */ protected $keyType = 'string'; }
“Composite” Primary Keys
Eloquent-এর জন্য প্রতিটি মডেলের অন্তত একটি স্বতন্ত্রভাবে চিহ্নিত করা “ID” থাকতে হবে যা এর primary key হিসেবে কাজ করতে পারে।
Laravel Eloquent-এ, একটি composite primary key হল একটি primary key যা একাধিক কলামের সমন্বয়ে গঠিত। এর অর্থ হল primary key শুধুমাত্র একটি কলাম নয় বরং একাধিক কলামের সংমিশ্রণ যা একটি ডাটাবেস টেবিলের প্রতিটি row কে স্বতন্ত্রভাবে চিহ্নিত করে।
Laravel Eloquent-এ একটি composite primary key ডিফাইন করতে, আপনি আপনার মডেল ক্লাসে protected $primaryKey property ব্যবহার করতে পারেন এবং composite primary key তৈরি করে এমন কলামের নামগুলির একটি অ্যারে বরাদ্দ করতে পারেন। উদাহরণ স্বরূপ:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Flight extends Model { use HasFactory; protected $table = 'my_flights'; protected $primaryKey = ['flight_id','passenger_id']; }
UUID & ULID Keys
UUID হল সর্বজনীন Unique Identifier, যা unique এবং অন্যান্য identifier গুলোর সাথে যেন সাংঘর্ষিক না হয় তার জন্য ডিজাইন করা হয়েছে। এটি একটি 128-বিট সংখ্যা যা সাধারণত ৩৬ টি অক্ষরের স্ট্রিং হিসাবে উপস্থাপন করা হয়, যেমন d305dcdc-7be2-11e9-8f9e-2a86e4085a59। এটি মূলত current timestamp, একটি random number এবং কম্পিউটারের MAC address সংমিশ্রনে UUID তৈরি করা হয়। UUID গুলি ডাটাবেসে primary key হিসাবে ব্যাপকভাবে ব্যবহৃত হয়, বিশেষ করে distributed system এ যেখানে একাধিক নোডের সমন্বয় ছাড়াই unique identifier গুলো তৈরি করতে হয়।
ULID যার পূর্ণরূপ হল Universally Unique Lexicographically Sortable Identifier, এবং এটি UUID এর মতই এটিকে unique এবং অন্যান্য Identifier এর সাথে যেন সাংঘর্ষিক না হয় , সেজন্য ডিজাইন করা হয়েছে। যাইহোক, ULID-এর অতিরিক্ত property আছে অভিধানিকভাবে সাজানো যায়, যার অর্থ হল যদি দুটি ULID-কে strings হিসাবে compare করা হয়, result টি সেই ক্রমকে প্রতিফলিত করবে যেখানে তারা তৈরি হয়েছিল। current timestamp, একটি random number এবং একটি custom encoding scheme যেটি lexicographic (অভিধানিকভাবে ) sorting নিশ্চিত করে তার সংমিশ্রণ ব্যবহার করে ইউএলআইডি তৈরি করা হয়। ULID গুলি এমন applications গুলিতে দরকারী যেখানে identifier গুলো ordered list প্রয়োজন হয়, যেমন timestamp-based databases বা distributed systems যেখানে দক্ষ অনুসন্ধানের জন্য ডেটা বাছাই করা প্রয়োজন।
UUID এবং ULID উভয়ই ডাটাবেসে primary keys হিসাবে ব্যবহার করা যেতে পারে এবং উভয়েরই সুবিধা এবং অসুবিধা রয়েছে ব্যবহারের ক্ষেত্রে নির্ভর করে। UUID গুলি databases এবং programming languages দ্বারা আরও ব্যাপকভাবে সমর্থিত, যখন ULID গুলি lexicographic sorting প্রদান করে এবং UUID গুলির তুলনায় আরও কমপ্যাক্ট।
কিভাবে একটি UUID ডাটাবেস টেবিল এ Insert করবেন ?
প্রথমে নিম্নোক্ত কমান্ডের মাধ্যমে Database এর জন্য Post নামে একটি Model এবং Migration File তৈরি করুন :
php artisan make:model Post -m
এবার আপনার Migration File এ up Method টি নিচের মতো করে আপডেট করে নিন :
public function up(): void { Schema::create('posts', function (Blueprint $table) { $table->string('id')->primary(); $table->string('title'); $table->text('content'); $table->timestamps(); }); }
এবার নিম্নোক্ত কমান্ডের মাধ্যমে Post Migration File থেকে posts table এর স্ট্রাকচার তৈরি করে নিন :
php artisan migrate
এবার App/Models/Post.php মডেল ফাইলে নিচের মতো করে আপডেট করে নিন :
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; public $incrementing = false; protected $keyType = 'string'; }
সর্বশেষ আপনার web.php route ফাইল এ নিচের মতো করে একটা route ডিফাইন করে , URL hit করুন :
use App\Models\Post; use Illuminate\Support\Str; Route::get('/uuid', function () { $post = new Post; $post->id = Str::uuid(); $post->title = 'My First Post'; $post->content = 'This is the content of my first post.'; $post->save(); });
এখন আপনি আপনার ডেটাবেস এ নিচের মতো uuid তৈরি হওয়া দেখতে পাবেন :
UUID Generate করার জন্য ramsey/uuid package এর ব্যবহার :
তবে আপনি চাইলে এই কাজটি ramsey/uuid package ব্যবহার করেও করতে পারেন। এর জন্য আমরা প্রথমে আমাদের Migration File এ up Method টি তে uuid নামে একটি unique কলাম তৈরি করব। আপনার Migration File টি নিচের মতো করে আপডেট করে নিন :
public function up(): void { Schema::create('posts', function (Blueprint $table) { $table->string('id')->primary(); $table->uuid('uuid')->unique(); $table->string('title'); $table->text('content'); $table->timestamps(); }); }
এবার নিম্নোক্ত কমান্ডের মাধ্যমে Post Migration File থেকে posts table এর স্ট্রাকচার update করে নিন :
php artisan migrate
এবার নিম্নোক্ত কমান্ডের মাধ্যমে ramsey/uuid package টি install করে নিন :
composer require ramsey/uuid
এই প্যাকেজটি একটি নতুন UUID তৈরি করার জন্য একটি Uuid::uuid4() method প্রদান করে। আপনি একটি UUID তৈরি করতে এই method টিকে কল করতে পারেন এবং ডাটাবেসে সংরক্ষণ করার আগে generated UUID-তে আপনার Eloquent model এর uuid attribute সেট করতে পারেন। আর এই ব্যাপারটা দেখার জন্য আমরা আমাদের web.php route file এ নিচের মতো করে কোড গুলো লিখব :
use App\Models\Post; use Illuminate\Support\Str; use Ramsey\Uuid\Uuid; Route::get('/uuid', function () { $uuid = Uuid::uuid4()->toString(); $post = new Post; $post->id = Str::uuid(); $post->uuid = $uuid; $post->title = 'My First Post'; $post->content = 'This is the content of my first post.'; $post->save(); });
এখন আপনি আপনার ডেটাবেস এ নিচের মতো uuid তৈরি হওয়া দেখতে পাবেন :
স্বয়ংক্রিয়ভাবে UUID Insert
তবে আপনি যদি চান আপনার primary key তে স্বয়ংক্রিয়ভাবে uuid insert হয়ে যাক , সেক্ষেত্রে আপনাকে আপনার মডেলটি নিচের মতো করে আপডেট করে নিতে হবে :
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Concerns\HasUuids; class Post extends Model { use HasFactory,HasUuids; public $incrementing = false; protected $keyType = 'string'; }
এবং আপনার Migration File এর up Method টি হবে নিম্নরুপঃ
public function up(): void { Schema::create('posts', function (Blueprint $table) { $table->string('id')->primary(); $table->string('title'); $table->text('content'); $table->timestamps(); }); }
এবার web.php route file টিতে আপনাকে শুধু অন্যান্য কলাম গুলো Insert করলেই হবে। আর কিছু করা লাগবেনা :
use App\Models\Post; Route::get('/uuid', function () { $post = new Post; $post->title = 'My First Post'; $post->content = 'This is the content of my first post.'; $post->save(); });
Timestamps
বাইডিফল্ট , Eloquent আপনার মডেলের সংশ্লিষ্ট ডাটাবেস টেবিলে created_at এবং updated_at কলাম দুটির উপস্থিতি আশা করে। মডেলগুলি তৈরি বা আপডেট করা হলে Eloquent স্বয়ংক্রিয়ভাবে এই কলাম দুটির value সেট করে। আপনি যদি এই কলামগুলি স্বয়ংক্রিয়ভাবে Eloquent দ্বারা ম্যানেজ না করতে চান, বা আপনার Table এ এই দুটি column না থেকে থাকে, তাহলে আপনাকে আপনার মডেলে একটি $timestamps property তে false value দিয়ে ডিফাইন করতে হবে:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * Indicates if the model should be timestamped. * * @var bool */ public $timestamps = false; }
আবার আপনি যদি আপনার মডেলের timestamps এর format কে customize করতে চান, আপনার মডেলে $dateFormat property সেট করুন। এই property টি নির্ধারণ করে কিভাবে date attribute গুলো ডাটাবেসে সংরক্ষণ করা হয় সেইসাথে তাদের format যখন মডেলটি একটি array বা JSON-এ serialized করা হয়:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The storage format of the model's date columns. * * @var string */ protected $dateFormat = 'U'; }
আপনি যদি timestamps সংরক্ষণ করতে ব্যবহৃত কলামগুলির নামগুলি কাস্টমাইজ করতে চান তবে আপনি আপনার মডেলে CREATED_AT এবং UPDATED_AT constants গুলি নতুন করে ডিফাইন করে এই কাজটি করতে পারেন :
<?php class Post extends Model { const CREATED_AT = 'creation_on'; const UPDATED_AT = 'updated_on'; }
এক্ষেত্রে আপনার Migration File টি হবে নিম্নরূপ:
public function up(): void { Schema::create('posts', function (Blueprint $table) { $table->string('id')->primary(); $table->string('title'); $table->text('content'); // $table->timestamps(); $table->timestamp('created_on')->nullable(); $table->timestamp('updated_on')->nullable(); }); }
withoutTimestamps() Method
Laravel-এ withoutTimestamps() method টি একটি মডেলের জন্য স্বয়ংক্রিয় timestamp জেনারেশন feature নিষ্ক্রিয় করতে ব্যবহৃত হয়। ডিফল্টরূপে, লারাভেল অনুমান করে যে একটি মডেলের জন্য ডাটাবেস টেবিলে রেকর্ড তৈরি এবং পরিবর্তনের সময় ট্র্যাক রাখার জন্য কলাম created_at এবং updated_at করা হয়েছে। আপনি যখন একটি মডেল তৈরি বা আপডেট করেন, তখন লারাভেল স্বয়ংক্রিয়ভাবে বর্তমান টাইমস্ট্যাম্প মানগুলির সাথে এই কলামগুলি আপডেট করে।
যাইহোক, কিছু ক্ষেত্রে, আপনি এই timestamp কলামগুলি ব্যবহার করতে নাও চাইতে পারেন, বা আপনি ভিন্ন নাম সহ ভিন্ন কলাম ব্যবহার করতে চাইতে পারেন। এই ধরনের ক্ষেত্রে, আপনি মডেলের জন্য স্বয়ংক্রিয় timestamp generation feature নিষ্ক্রিয় করতে withoutTimestamps() Method টি ব্যবহার করতে পারেন।
এক্ষেত্রে আপনি $timestamps property তে false value ব্যবহারের পরিবর্তে withoutTimestamps() Method টি ব্যবহার করতে পারেন:
use App\Models\Post; Route::get('/update', function () { $post = Post::find(1); Post::withoutTimestamps(function () use ($post) { $post->update(['title' => 'This is New Title']); }); });
উপরের উদাহরণটি প্রয়োগ করতে হলে , আপনাকে আপনার মডেলে $fillable property এর array তে title কলাম টি থাকতে হবে।
Database Connections
বাইডিফল্ট , সমস্ত Eloquent model গুলো আপনার অ্যাপ্লিকেশনের জন্য কনফিগার করা ডিফল্ট ডাটাবেস সংযোগ ব্যবহার করে। যা আপনার application এর config ফোল্ডারের মধ্যে অবস্থিত database.php ফাইলে ডিফল্ট হিসেবে দেওয়া আছে:
তবে আপনি চাইলে ডিফল্ট ডেটাবেসের সাথে অন্য ডেটাবেস ও connect করতে পারেন। আর এর জন্য আপনাকে প্রথমে .env তে নিচের মতো করে একাধিক ডেটাবেসের জন্য কানেকশন তৈরি করতে হবে:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=w3programmers DB2_CONNECTION=mysql2 DB2_HOST=127.0.0.1 DB2_PORT=3306 DB2_DATABASE=salesdb DB2_USERNAME=root DB2_PASSWORD=w3programmers
এবার আপনার Laravel Project ফোল্ডারের config ফোল্ডারের মধ্যে database.php ফাইলে connections array এর মধ্যে নিচের মতো করে দুটি ডেটাবেসের জন্য দুটি connection নাম দিয়ে কনফিগার করতে হবে:
'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'mysql2' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB2_HOST', '127.0.0.1'), 'port' => env('DB2_PORT', '3306'), 'database' => env('DB2_DATABASE', 'forge'), 'username' => env('DB2_USERNAME', 'forge'), 'password' => env('DB2_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
Note: এখন এই দুটি Connection এর জন্য কোনটি default হিসেবে ব্যবহার করবেন, সেটি আপনি এই database.php ফাইলের ১৮ নম্বর লাইনে বলে দিতে পারবেন :
যদি আপনার সব কিছু ঠিকঠাক থাকে, তাহলে আপনি সাধারণ Laravel Query Builder ব্যবহার করে সম্পূর্ণ ভিন্ন দুটি ডেটাবেসের ভিন্ন টেবিল থেকে ডেটা নিয়ে আসত পারেন। তবে এক্ষেত্রে ডিফল্ট কানেকশন ছাড়া বাকি কানেকশন গুলোর জন্য আপনাকে connection() মেথডটি ব্যবহার করতে হবে:
use Illuminate\Support\Facades\DB; Route::get('/multidb', function () { $employees = DB::table('employees')->get(); //There is no need to use connection() Method, because here we use default connection echo "<pre>"; print_r($employees); echo "</pre>"; $porducts = DB::connection("mysql2")->table('products')->get(); //We need to use connection() Method here, because here we use another db connection echo "<pre>"; print_r($porducts); echo "</pre>"; });
তবে আপনি যদি Eloquent Model ব্যবহার করে অন্য ডেটাবেস কানেকশন ব্যবহার করতে চান , সেক্ষেত্রে আপনাকে আপনার Model এ protected $connection property তে উক্ত connection name বলে দিতে হবে। এক্ষেত্রে আমাদের Employee Model এবং Product Model হবে নিম্নরুপঃ
Employee Model with Default Connection
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Employee extends Model { use HasFactory; }
Product Model with another Connection
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Product extends Model { use HasFactory; protected $connection="mysql2"; }
এখন আপনি দুটি Model ব্যবহার করেই সম্পূর্ণ ভিন্ন দুটি ডেটাবেস থেকে নিম্নোক্ত উপায়ে টেবিল থেকে ডেটা নিয়ে আসতে পারেন :
use App\Models\Employee; use App\Models\Product; Route::get('/multidb', function () { $employees = Employee::all(); echo "<pre>"; print_r($employees); echo "</pre>"; $porducts = Product::all(); echo "<pre>"; print_r($porducts); echo "</pre>"; });
Default Attribute Values
Laravel এর Eloquent ORM-এ $attributes property হচ্ছে একটি মডেলের জন্য attribute এর default value নির্ধারণ করতে ব্যবহৃত হয়। এই attributes গুলি হল মডেলের attributes যা ডাটাবেস টেবিলের কলাম গুলিকে রিপ্রেজেন্ট করে
উদাহরণস্বরূপ, ধরা যাক আপনার কাছে একটি Product মডেল রয়েছে যা ডাটাবেসের products table কে রিপ্রেজেন্ট করে। এখন আপনি চাচ্ছেন , যদি model এ একটি নতুন instance তৈরি করার সময় সেট করা না হয়, তাহলে Model নিজেই একটি Default Value দিয়ে দিক। তখন আপনি Default Attribute Values ফীচার টি ব্যবহার করতে পারেন। এইটা অনেকটা নিম্নরুপঃ
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { public $timestamps = false; /** * The model's default values for attributes. * * @var array */ protected $attributes = [ 'price' => 0.0, ]; }
এই উদাহরণে, $attributes property টি এমন property গুলির জন্য default value গুলো নির্ধারণ করতে ব্যবহৃত হয় যা Product model এ একটি নতুন instance তৈরি করার সময় সেট করা না হয় । এই ক্ষেত্রে, price attribute এর একটি default value 0.0 সেট করা হয়েছে।
এখন যদি আপনি নিম্নোক্ত কোড টি route থেকে রান করেন , তাহলে আপনি লক্ষ্য করবেন ,আপনার price column এর Default Value হিসেবে 0.0 সেট করা হবে।
use App\Models\Product; Route::get('/insert', function () { $products=new Product; $products->product_name="Panjabi"; $products->save(); echo "<pre>"; print_r($products->all()); echo "</pre>"; });
Configuring Eloquent Strictness
লারাভেল বেশ কয়েকটি methods অফার করে যা আপনাকে বিভিন্ন পরিস্থিতিতে Eloquent এর behavior এবং “strictness” configure করতে দেয়।
প্রথমত, preventLazyLoading method একটি optional boolean argument গ্রহণ করে যা নির্দেশ করে যে lazy loading প্রতিরোধ করা উচিত কিনা। উদাহরণস্বরূপ, আপনি non-production পরিবেশে শুধুমাত্র lazy loading ডিজ্যাবল করতে চাইতে পারেন যাতে আপনার production environment স্বাভাবিকভাবে কাজ করতে পারে এমনকি যদি একটি lazy loading সম্পর্ক ঘটনাক্রমে production কোডে উপস্থিত থাকে। সাধারণত, এই method টি আপনার অ্যাপ্লিকেশনের app/Providers/AppServiceProvider-এর boot method এ ব্যবহার করা উচিত:
use Illuminate\Database\Eloquent\Model; /** * Bootstrap any application services. */ public function boot(): void { Model::preventLazyLoading(! $this->app->isProduction()); }
এছাড়াও, আপনি লারাভেলকে preventSilentlyDiscardingAttributes method ব্যবহার করে একটি exception throw করতে নির্দেশ দিতে পারেন যখন একটি unfillable attribute পূরণ করার চেষ্টা করা হয় । মডেলের fillable array তে যোগ করা হয়নি এমন একটি attribute সেট করার চেষ্টা করার সময় এটি local development এর সময় অপ্রত্যাশিত errors গুলি প্রতিরোধ করতে সহায়তা করতে পারে:
Model::preventSilentlyDiscardingAttributes(! $this->app->isProduction());