বাংলায় PHP LARAVEL FRAMEWORK পর্ব-১৫ : Retrieving with Eloquent ORM Model

Laravel ১৫ তম পর্বে আপনাকে স্বাগতম। এই পর্বটি বুঝতে হলে আপনাকে প্রথমে বুঝতে হবে Model কি? Eloquent এবং ORM কি?

Retrieving with Laravel Eloquent ORM Model

Model কি?

MVC Framework এর মধ্যে “M” অক্ষরটি Model এর জন্য ব্যবহৃত হয়। Laravel Framework এ Model এর কাজ হচ্ছে Database সংশ্লিষ্ঠ কাজ গুলো করা। MVC ভিত্তিক যেকোনো software অথবা Web Application এর সমস্ত Database সংশ্লিষ্ঠ কাজ গুলো রাখা হয় Model নামক একটি class এ । এবং পরবর্তীতে এই Model Class টি extend করার মাধ্যমে আমরা আমাদের প্রয়োজনীয় নতুন নতুন Model Class তৈরী করতে পারি। যদিও Laravel Framework এ Database এর কাজ গুলো Route এবং Controller এ ও করা যায়। আলাদাভাবে Model ব্যাবহার করা হচ্ছে MVC Platform এর একটি আদর্শ পদ্ধতি। আর এতে সুবিধা হচ্ছে আপনার software অথবা Web Application এর সব Database Logic গুলো route এর মধ্যে একসাথে না রেখে আলাদা একটা পৃথক ফাইল অর্থাৎ একটি সিঙ্গেল Model Class এর মধ্যে রাখা। Laravel Framework এ Model ফাইল গুলা সরাসরি app ডিরেক্টরিতে থাকে ।

Object Relational Mapping (ORM) কি?

Object Relational Mapping (ORM) হচ্ছে এক ধরনের কৌশল বা Design Pattern, যা ব্যবহার করে object-oriented উপায়ে Database এর Object গুলোর মধ্যে Relation তৈরি করে। ORM এ Database এর প্রত্যেকটি table কে এক একটি আলাদা Object হিসেবে বিবেচনা করা হয়।

Eloquent ORM কি?

Eloquent হলো একটি ORM এর নাম, যা Laravel Framework এ Active Record প্রয়োগের জন্য তৈরী করা হয়েছে। আরো সহজ ভাবে বলা যায় Eloquent হচ্ছে Database এর query এর জন্য একটি নতুন এবং advance কৌশল যা আপনার Database এর complex query এর জন্য সহজ syntax প্রদান করে।

Laravel Framework এ Eloquent ORM Model কিভাবে কাজ করে?

Laravel Framework এ Eloquent ORM হলো একটি Model class যার থেকে আমরা বিভিন্ন child class তৈরী করার মাধ্যমে নতুন নতুন Model তৈরী করতে পারি। আর প্রতিটি Child Model class এর প্রতিটি Object এক একটি table এর object কে represent করে। মনে করি আমাদের একটি টেবিল আছে যার নাম students. তাহলে আপনাকে Laravel এর Eloquent ORM থেকে এটিকে extend করে একটি Student নামে child class তৈরী করতে হবে, এখন যদি আপনি আপনার নতুন Student child class এর একটি instance তৈরি করেন, তাহলে আপনাকে আর কোন Query লিখতে হবে না, অর্থাৎ, Laravel Framework এ আমরা Eloquent ORM ব্যবহার করে কোনও SQL statement না লিখেই Database table এ Create, Edit, Delete, Select এবং আরও অনেক কিছুই এমনকি Relational Database এর কাজ ও করতে পারব !

Eloquent ORM Model নিয়ে কাজ করার পূর্বপ্রস্তুতি :

Laravel Framework এ Eloquent ORM Model নিয়ে কাজ করতে হলে আপনাকে প্রথমে Database এর host এর সাথে connect এবং Database Select করতে হবে। আর এর জন্য আপনাকে আপনার project এর root ফোল্ডারের .env ফাইল এ Database এর host, username, password এবং Database name বলে দিতে হবে। নিচের ছবিটি লক্ষ্য করুন :

Laravel Database Connection in .env file-

Note: .env file edit করার পর অবশ্যই php artisan সার্ভার টি রিস্টার্ট দিতে হবে। অথবা “php artisan config:clear” এই command টি run করতে হবে।

এবার আপনি আমাদের Migration এর উপর লেখা article দেখানো নিয়মে students নামে নতুন একটি Table তৈরী করুন।

সব কিছু ঠিক থাকলে আপনার নতুন students table টি ঠিক নিচের মত হবে:

Students Table for Laravel ORM

মডেল তৈরিঃ

Laravel Framework এ artisan command এর মাধ্যমে খুব সহজে আমরা নতুন নতুন Model তৈরী করতে পারি , ধরুন আমরা students table এর জন্য student নামে একটি Model তৈরী করব। চলুন artisan কমান্ড এর মাধ্যমে কাজটি সেরে ফেলিঃ

php artisan make:model Student

আপনি যদি মডেল তৈরি করার সময় Database Migragion তৈরি করতে চান, তাহলে আপনি –migration অথবা -m option টি ব্যবহার করতে পারেন:

php artisan make:model Student --migration
php artisan make:model Student --m

মডেল গুলো সাধারণ ভাবে app ডিরেক্টরির রুটেই থাকে, মডেলটি খুললে আমরা এরকম পাবোঃ

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
}

Laravel Framework এ Eloquent ORM Model এর কিছু Conversion

Table Name:

Laravel Framework এ বাই ডিফল্ট table এর নাম বহুবচন (plural) এবং Model এর নাম একবচন (singular) হয়। সুতরাং আপনি যদি আপনার project একটি student entity তৈরী করতে চান , তাহলে আপনার table এর নাম হবে “students” এবং আপনার Model এর নাম হবে Student. এই কনভেনশনটিতে আপনার মডেলের table এর নাম দিতে হবে না কারণ Eloquent ইতিমধ্যেই আপনার জন্য table এর নাম assign করে রেখছে। কিন্তু যদি আপনার আলাদা আলাদা টেবিলের নাম থাকে (অথবা লরেভেল কনভেনশন অনুসরণ না করেন) তাহলে আপনাকে আপনার table এর নাম আপনার Model এ assign করে দিতে হবে।

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
protected $table = "your_table_name"
}

Primary Keys

Laravel Framework এ Eloquent ORM বাই ডিফল্ট ধরে নেয় যে প্রতিটি টেবিলে id নামক একটি primary_key কলাম আছে। তবে আপনি চাইলে table এর primary_key একটি protected $primaryKey property দিয়ে পরিবর্তন করতে পারেন।

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
protected $primaryKey= "student_id"
}

NON-INCREMENTAL এবং Non- NUMERIC primary_key

একইভাবে , Eloquent ORM ধরে নেয় যে primary_key এক এক করে বৃদ্ধি পাওয়া (incremental) একটি integer মান, যার অর্থ হল ডিফল্টভাবে primary_key স্বয়ংক্রিয়ভাবে এক এক করে বৃদ্ধি পাওয়া একটি int VALUE হবে। যদি আপনি একটি NON-INCREMENTAL বা একটি Non- NUMERIC primary_key ব্যবহার করতে চান তবে আপনাকে আপনার মডেলের $incrementing property কে false সেট করতে হবে। যদি আপনার primary_key টি integer না হয়, তবে আপনি চাইলে table এর primary_key type একটি protected $keyType property দিয়ে stirng এ পরিবর্তন করতে পারেন।

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
 
 
protected $incrementing= false;
protected $keyType= 'string';
}

Timestamps

ডিফল্ট হিসাবে, Eloquent আপনার Database এর table এর মধ্যে created_at এবং updated_at কলাম দুইটি উপস্থিতির আশা করে। যদি আপনি এই কলামগুলি স্বয়ংক্রিয়ভাবে Eloquent দ্বারা পরিচালিত করতে না চান, তাহলে আপনার মডেলের $timestamps property টা false সেট করতে পারেন:

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
 
public $timestamps = false;
}

Date Format

আপনি যদি আপনার timestamps এর format কে customize করতে চান , তাহলে আপনাকে আপনার Model এ $dateFormat property তে সেটি set করে দিতে হবে। $dateFormat property নির্ধারণ করে date attributes গুলো কিভাবে database এ store হবে একইভাবে কিভাবে তাদের format গুলো যখন সেটি array অথবা json এ serialize হয়।

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
 
 protected $dateFormat = 'U';
}

যদি আপনি timestamps সংরক্ষণ করতে ব্যবহৃত কলামের নাম customize করতে চান, তাহলে আপনি আপনার মডেলের CREATED_AT এবং UPDATED_AT constants সেট করার মাধ্যমে সেটি করতে পারেন:

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
 
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
}

Database Connection

ডিফল্টরূপে, সব Eloquent মডেল আপনার অ্যাপ্লিকেশনের জন্য default database configuration ব্যবহার করবে। আপনি মডেলের জন্য একটি পৃথক database configuration নির্দিষ্ট করতে চাইলে, $connection property ব্যবহার করতে পারেন :

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Student extends Model
{
    //
 
   protected $connection = 'connection-name';
}

Model ব্যবহার করে data retrieve:

একবার আপনি একটি Model এবং তার সংশ্লিষ্ট Database table তৈরি করেছেন, তখন আপনি আপনার Database থেকে Data Retrieve শুরু করতে প্রস্তুত। একটি শক্তিশালী query builder হিসাবে প্রতিটি eloquent মডেলের কথা ভাবুন যাতে আপনি মডেলের সঙ্গে যুক্ত Database এর table কে স্বচ্ছভাবে query করতে পারেন। Student Model ব্যবহার করে Database নিয়ে কাজ করার জন্য এখন আমরা একটা Student নামে Controller তৈরী করব। CLI তে আপনার project ডিরেক্টরিতে access করে নিচের artisan command টি run করুন:

php artisan make:model Student -mcr

এখন app/Http/Controllers folder এ StudentController টি তৈরী হয়ে গেছে, নিচের ছবিটি লক্ষ্য করুন :

Student Controller

একই ভাবে আপনার Student Model ও তৈরী হয়ে গেছে, নিচের ছবিটি লক্ষ্য করুন :

Student Model

এবার StudentController এর index Method এ নিচের code টি লিখুন :

$students=Student::all();
 
foreach($students as $student){
 echo $student->name,"<br>";
}

এবার আপনার route এ StudentController এর index method টি define করুন , ঠিক নিচের মত:

Route::get('/getstudent', 'StudentController@index');

এখন আপনি আপনার ব্রাউজার এ http://localhost:8000/getstudent হিট করেন

Eloquent ORM এ অতিরিক্ত Condition যোগ করা

Eloquent all Method মডেল সাধারণত টেবিলের সব result return করে । যেহেতু প্রতিটি eloquent মডেল একটি Query Builder হিসাবে কাজ করে, আর তাই আপনি বিভিন্ন অতিরিক্ত condition যোগ করতে পারেন, এবং তারপর result পেতে get Method ব্যবহার করতে পারেন :

এবার StudentController এর index Method এ নিচের code টি লিখুন :

$students = Student::where('status', 1)
              ->orderBy('name', 'desc')
              ->take(3)
              ->get();
       foreach ($students as $student) {
           echo $student->name,"<br>";
       }

এখন আপনি যদি আপনার ব্রাউজার এ http://localhost:8000/getstudent হিট করেন তাহলে নিচের মত ফলাফল দেখাবে :

Additional constraints in Eloquent

Chunking Results (খন্ডে খন্ডে ফলাফল প্রদর্শন)

অনেক বেশি row নিয়ে কাজ করতে গেলে অনেক সময় আমাদেরকে row গুলো ভাগে ভাগে প্রদর্শন করতে হয়। যেমন google আমাদেরকে তার search page এ একসাথে ১০ টির বেশি data প্রদর্শন করেনা, এইরকম একসাথে সব data না নিয়ে এসে খন্ডে খন্ডে দেখানোর জন্য আপনি Laravel Eloquent এর chunk Method ব্যবহার করতে পারেন।

এবার StudentController এর index Method এ নিচের code টি লিখুন :

$students = Student::chunk(20, function ($students) {
           foreach ($students as $student) {
               //
           }
       });

Retrieving Single Models / Aggregates

Laravel Framework এ , একটি টেবিল থেকে সমস্ত row গুলোর পরিবর্তে আপনি find বা first ব্যবহার করে একক row retrieve করতে পারেন। আর এই কাজটি single model instance দিয়েই করা যেতে পারে। এবার StudentController এর index Method এ নিচের code টি লিখুন :

echo Student::find(1)->name;
      echo "<br>";
      echo Student::where('status', 1)->first();
      echo "<br>";
     foreach(Student::find([1, 4]) as $student){
       echo $student->name,"<br>";
     }

এখন আপনি আপনার ব্রাউজার এ http://localhost:8000/getstudent হিট করেন