বাংলায় PHP LARAVEL FRAMEWORK পর্ব-১০: Retrieving Results with Query Builder

Laravel Framework এ Database Query Builder কি?

Laravel Database query builder

Query Builder হচ্ছে Laravel এর একটি Facades Class যা আপনাকে Database query গুলো তৈরী এবং চালনা করার জন্য একটি সহজ এবং স্বচ্ছ ইন্টারফেস এর সুবিধা দেয়। এটি আপনার অ্যাপ্লিকেশনে Database সংশ্লিট সব ধরণের কাজের জন্য ব্যবহার করা যেতে পারে এবং Laravel এ support করে এমন সব Database System (যেমন: MySQL, PostgreSQL,SQLite,SQL Server) এর সাথে কাজ করে। query builder যেহেতু PDO parameter binding ব্যবহার করে তাই এটি ব্যবহারের ফলে আপনার application এ SQL injection attack হওয়া থেকে বিরত রাখে। এবং Binding Parameter হিসাবে পাস করা স্ট্রিং clean করার কোন প্রয়োজন হয়না।

facade কি?

Note: facade হচ্ছে class গুলোকে একটি static interface প্রধান করে বা Laravel Framework এ facade গুলো Service Container এর মধ্যে static froxy হিসেবে কাজ করে। অর্থাৎ class এর Method গুলোকে Traditional static Method গুলোর তুলনায় আরো মসৃণ, সংক্ষিপ্ত static code করার সুযোগ দেয় ।

Query Builder নিয়ে কাজ করার পূর্ব প্রস্তুতি :

Laravel Framework এ Database Query Builder নিয়ে কাজ করতে হলে আপনাকে প্রথমে 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 করতে হবে।

এবার Laravel Framework এ Query Builder এর Query গুলো বুঝার জন্য আমরা আলাদা ভাবে একটা Route define করব এবং একটা Controller তৈরী করব, চলুন প্রথমে আমরা /getquery url এবং getqueryController point করার জন্য routes/web.php তে আমাদের route defina করি :

Route::get('/getquery', 'getqueryController@index');

এবার আমরা CLI তে আমাদের getqueryController টি তৈরী করব:

php artisan make:controller getqueryController

এখন আপনার app/Http/Controllers ফোল্ডারে getqueryController.php file এ নিচের মত কোড গুলো দেখতে পাবেন।

<?php
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
    //
}

এখন আমরা আমাদের getqueryController class এ একটা index Method তৈরী করব। আমাদের getqueryController টি দেখতে নিচের মত হবে:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
   public function index(){
        echo "Welcome to Query Builder class";
    }
}

এখন আমরা http://localhost:8000/getquery রান করার মাধ্যমে চেক করব সব ঠিক আছে কিনা।

getquery

Laravel Framework এ Query Builder নিয়ে কাজ করার জন্য আমাদের সব ধরণের প্রস্তুতি শেষ, এখন আমরা ধাপে ধাপে সব ধরণের Databasse Query Method গুলো দেখবো।

Laravel Query Builder দিয়ে Database Table এর Result গুলো retrieve করা :

আমাদের দৈনন্দিন কাজে Database নিয়ে কাজ করতে গেলে , আমাদেরকে একটি Database এর ভিন্ন ভিন্ন Table থেকে অনেক ভাবে Data Retrieve করতে হয়। Laravel Framework এ DB Facade এর table Method দিয়ে আমরা এই কাজ গুলো খুব সহজে করতে পারি। চলুন একে একে সবধরণের Retrieve পদ্ধতি দেখা যাক:

Database এর এক টিনির্দিষ্ট table থেকে সব row একসাথে retrieve করা :

Database এর table থেকে সব গুলো row retrieve করার জন্য আপনি DB facade এর table Method টি ব্যবহার করতে পারেন। table Method টি আপনার দেওয়া Database table থেকে instance হিসেবে একটি fluent query builder রিটার্ন করবে। যেটি আপনাকে আরো অনেকগুলো specific chain method এর ব্যবহারের সুযোগ দিবে, এবং সর্বশেষে get() Method দিয়ে আপনার ফলাফল পেতে সাহায্য করবে। চলুন একটা উদাহরণ দিয়ে আরো ভালো ভাবে বুজে নেয়া যাক :

প্রথমে আমাদের app/http/Controllers/getqueryController Class এর কাজ :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
class getqueryController extends Controller
{
    public function index(){
         $students = DB::table('students')->get();
         return view('students', ['students' => $students]);
    }
}

ব্যাখ্যা: এখানে প্রথমে আমরা ৩ নম্বর লাইনে Laravel এর DB Facade টি ব্যবহার করি , তারপর ৮ নম্বর লাইনে DB Facade এর table Method এর মধ্যে আমরা যেই table থেকে data retrieve করব তার নাম দেয়, (আমরা এখানে students table ব্যবহার করি ) . সর্বশেষ আমরা get() Method দিয়ে সব data retrieve করে $students variable এ রাখি। ৯ নম্বর লাইনে students.php view file এ আমরা Data গুলো পাঠাই।

দ্বিতীয়ত: আমাদের resources/views/students.php view file এর কাজ

<!DOCTYPE html>
<html>
<head>
    <title>Students View</title>
</head>
<body>
<?php
foreach ($students as $student) {
    echo $student->name,"<br>";
}
?>
</body>
</html>

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

Database এর একটি নির্দিষ্ট table থেকে একটি single row অথবা single column retrieve করা

আপনি Database এর table থেকে একটি single row অথবা single column retrieve করার প্রয়োজন হলে, আপনি first Method ব্যবহার করতে পারেন। আপনার getqueryController class এ নিচের কোডটি লিখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
    public function index(){
        $user = DB::table('students')->where('name', 'Sahab Uddin')->first();
        echo $user->name;
    }
}

আপনি সম্পূর্ণ row এর পরিবর্তে সরাসরি একটি column এর value print করতে চাইলে value() method টি ব্যবহার করতে পারেন। এর জন্যে আপনার getqueryController class এ নিচের কোডটি লিখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
    public function index(){
        $email = DB::table('students')->where('name', 'Sahab Uddin')->value('email');
        echo $email;
    }
}

Table এর একটি নির্দিষ্ট column এর সব row একসাথে retrieve করা :

Table এর একটি নির্দিষ্ট column এর সব row একসাথে retrieve করতে চাইলে আপনি DB facade এর pluck() Method ব্যবহার করতে পারেন। নিচের উদাহরণটি দেখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
    public function index(){
        $names = DB::table('students')->pluck('name');
        foreach ($names as $name) {
            echo $name,"<br>";
        }
    }
}

তবে আপনি চাইলে table এর একটি column কে key এবং অন্যটিকে value হিসেবে রিটার্ন করতে পারেন । নিচের উদাহরণটি দেখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
    public function index(){
        $names = DB::table('students')->pluck('name','id');
        foreach ($names as $id=>$name) {
            echo "ID: ", $id;
            echo " Name: ", $name,"<br>";
        }
    }
}

Chunking Results

Database এ হাজার হাজার record নিয়ে কাজ করতে গেলে আপনাকে অনেক সময় সব ডাটা একসাথে retrive করতে বিভিন্ন সমস্যায় পড়তে হয়, এর জন্য আপনি DB facade এর chunk method ব্যবহার করতে পারেন। নিচের উদাহরণটি দেখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
 
class getqueryController extends Controller
{
    public function index(){
        DB::table('students')->orderBy('id')->chunk(2, function ($students) {
            echo "<pre>";
            print_r($students);
            echo "</pre>";
        });
    }
}

Aggregates

Laravel Query Builder count, max, min, avg, এবং sum নামে কিছু aggregate Method এর সুবিধা দেয়, নিচে এগুলোর কিছু উদাহরণ দেওয়া হলো :

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')
                ->where('finalized', 1)
                ->avg('price');