যারা বাংলাদেশের ৩৬ তম Zend Certified Engineer এবং এই সাইট (w3programmers) এর স্বত্বাধিকারী এবং লেখক Masud Alam স্যার এর কাছে কাছে সপ্তাহে ২ দিন ক্লাস, ৬ দিন প্রাকটিস করতে চান তাদের জন্য আগামী ১ February 2018 (বৃহস্পতি এবং শুক্রবার সন্ধ্যা ৬:০০ টা রাত ৯:০০ টা) থেকে শুরু হতে যাচ্ছে ৫ মাস ব্যাপী Professional Web Design & Development With HTML, CSS, JAVASCRIPT, JQUERY, PHP & MySQL for Beginners কোর্স (এই কোর্স টি যারা ফ্রিল্যান্সিং এবং আউটসোর্সিং কাজে আগ্রহী বিশেষ ভাবে তাদের জন্য design করা হয়েছে। ), আগামী ৪ February 2018 ( রবি এবং মঙ্গলবার সন্ধ্যা ৬:০০ টা থেকে রাত ৯:০০ টা ) থেকে শুরু হতে যাচ্ছে ৪ মাস ব্যাপী Zend Certified PHP 7.1 Engineering কোর্স। যেটা Advance PHP কোর্স নামে পরিচিত । এবং ৫ February 2018 (সোম এবং বুধবার সন্ধ্যা ৬:০০ টা থেকে রাত ৯:০০ টা) থেকে শুরু হতে যাচ্ছে ৪ মাস ব্যাপী Laravel 5.5 Professional Beginning to Advance Course কোর্স ।এই কোর্স গুলোতে তিনি ছাত্রদের কে সপ্তাহে ২ দিন ৩ ঘন্টা করে ৬ ঘন্টা ক্লাস নিবেন , এবং শনি থেকে বৃহস্পতি সপ্তাহে ৬ দিন ই স্যার এর অফিসে বসে প্রাকটিস করার সুযোগ দিবেন ! এতে প্রাকটিস করা কালীন ছাত্র-ছাত্রীরা কোনো সমস্যায় পড়লে তাৎক্ষণিক স্যার এর সহযোগিতা পাবে . (উল্লেখ্য: Training গুলো স্যার তার techbeeo software company'r পাশাপাশি পরিচালনা করে থাকেন।) কোর্স গুলো সম্পর্কে বিস্তারিত জানতে পারবেন এই লিংকে : Course Details .কোর্স গুলোর প্রত্যেকটির ফী নির্ধারণ করা হয়েছে ৩০,০০০ টাকা। আগ্রহীদেরকে অতিসত্বর মাসুদ আলম স্যার এর সাথে যোগাযোগ করার জন্য অনুরোধ করা যাচ্ছে। স্যার এর মোবাইল নম্বর : ০১৭২২ ৮১ ৭৫ ৯১

বাংলায় PHP LARAVEL FRAMEWORK পর্ব-১১: Database selects, joins, Unions with Query Builder

Database selects, joins, Unions with Query Builder

Database selects, joins, Unions with Query Builder

Laravel ১১ তম পর্বে আপনাকে স্বাগতম। এই পর্বটি বুঝতে হলে আপনাকে অবশ্যই আমাদের এর আগের পর্ব অর্থাৎ ১০ তম পর্বটি পড়ে আসতে হবে। বিশেষ ভাবে Query Builder নিয়ে কাজ করার পূর্ব প্রস্তুতি এই পার্ট টুকু দেখে নিতে হবে। এই পর্বে আমরা Laravel Query Builder দিয়ে Database এর যেকোনো table থেকে Data Select করা , Database এ এক বা একাধিক table এর মধ্যে join করা এবং Database এ কিভাবে দুটি query এর মধ্যে Union করা যায় তা শিখব।

একটি নির্দিষ্ট column এর সবগুলো row কে show করা

Laravel Framework এ একটি নির্দিষ্ট column এর সবগুলো row কে show করার জন্য আপনি select() method টি ব্যবহার করতে পারেন। আপনার 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')->select('name', 'email as student_email')->get();
		$table="<table border='1' width='300'";
		$table.="<tr><th>Name</th><th>Email</th></tr>";
		foreach($students as $student){

		$table.="<tr><td>$student->name</td><td>$student->student_email</td></tr>";
				
		}
		$table.="</table>";
		echo $table;
	}
}

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

laravel query builder

laravel query builder

Laravel Framework এ একটি নির্দিষ্ট column এর duplicate value গুলো বাদ দিয়ে unique value যুক্ত row গুলো কে select করার জন্য আপনি distinct() method টি ব্যবহার করতে পারেন। আপনার 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')->distinct()->get(["name"]);
		foreach($students as $student){
			echo $student->name,"<br>";
		}
	}
}

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

Laravel Distinct

Laravel Distinct

existing select clause এর সাথে আরো নতুন column add করার জন্য আপনি addSelect() Method টি ব্যবহার করতে পারেন। আপনার getqueryController class এ নিচের কোডটি লিখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class getqueryController extends Controller
{
	public function index(){
	
		$query = DB::table('students')->select('name');
		$students = $query->addSelect('email')->get();

		$table="<table border='1' width='300'";
		$table.="<tr><th>Name</th><th>Email</th></tr>";
		foreach($students as $student){

		$table.="<tr><td>$student->name</td><td>$student->email</td></tr>";
				
		}
		$table.="</table>";
		echo $table;
	}
}

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

laravel query builder

laravel query builder

Joins

Laravel Framework এর Query Builder Facade class দিয়ে আপনি এক বা একাধিক table এর মধ্যে inner join, left join এবং cross joining এর কাজ গুলো খুব সুন্দরভাবে করতে পারেন। নিচে আমরা একটা একটা করে সব গুলোর ব্যবহার দেখব।

Inner Join Clause

Laravel Framework এর Query Builder Facade class এর join() method দিয়ে আপনি inner joining এর কাজ গুলো খুব সুন্দরভাবে করতে পারেন। এর জন্য join Method এর প্রথম argument এ আপনাকে Database এর table নাম দিতে হবে, আর বাকি argument গুলোতে যেইসব column এর ভিত্তিতে join করব তার নাম দিতে হবে। join উদাহরণ গুলো বুঝার জন্য নিচের sql গুলো আপনার Laravel নামক database এ execute করুন।

-- phpMyAdmin SQL Dump
-- version 4.7.0
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Jan 07, 2018 at 06:24 AM
-- Server version: 10.1.24-MariaDB
-- PHP Version: 7.1.6

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

--
-- Database: `laravel`
--

-- --------------------------------------------------------

--
-- Table structure for table `contacts`
--

CREATE TABLE `contacts` (
  `id` int(11) NOT NULL,
  `student_id` int(11) NOT NULL,
  `email` varchar(100) NOT NULL,
  `phone` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `contacts`
--

INSERT INTO `contacts` (`id`, `student_id`, `email`, `phone`) VALUES
(1, 1, '[email protected]', '01788229900'),
(2, 2, '[email protected]', '01788339922'),
(3, 3, '[email protected]', '01677229988'),
(4, 4, '[email protected]', '01799228877'),
(5, 5, '[email protected]', '0165778899');

-- --------------------------------------------------------

--
-- Table structure for table `courses`
--

CREATE TABLE `courses` (
  `id` smallint(5) UNSIGNED NOT NULL,
  `course_name` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `courses`
--

INSERT INTO `courses` (`id`, `course_name`) VALUES
(1, 'PHP & MySQL for Beginner'),
(2, 'ZCPE (PHP Advance Course)'),
(3, 'Laravel 5.5 Beginning to Advance'),
(4, 'JavaScript and Jquery Advance');

-- --------------------------------------------------------

--
-- Table structure for table `course_choice`
--

CREATE TABLE `course_choice` (
  `id` int(11) NOT NULL,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `course_choice`
--

INSERT INTO `course_choice` (`id`, `student_id`, `course_id`) VALUES
(1, 1, 1),
(2, 2, 3),
(3, 2, 2),
(4, 3, 1),
(5, 4, 2);

-- --------------------------------------------------------

--
-- Table structure for table `students`
--

CREATE TABLE `students` (
  `id` smallint(5) UNSIGNED NOT NULL,
  `name` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `students`
--

INSERT INTO `students` (`id`, `name`) VALUES
(1, 'Mridul'),
(2, 'Al-Amin'),
(3, 'Sohag'),
(4, 'Mainul'),
(5, 'Samim'),
(6, 'Russel'),
(7, 'Saiful');

--
-- Indexes for dumped tables
--

--
-- Indexes for table `contacts`
--
ALTER TABLE `contacts`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `courses`
--
ALTER TABLE `courses`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `course_choice`
--
ALTER TABLE `course_choice`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `students`
--
ALTER TABLE `students`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `contacts`
--
ALTER TABLE `contacts`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- AUTO_INCREMENT for table `courses`
--
ALTER TABLE `courses`
  MODIFY `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT for table `course_choice`
--
ALTER TABLE `course_choice`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- AUTO_INCREMENT for table `students`
--
ALTER TABLE `students`
  MODIFY `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;COMMIT;

এবার Laravel query builder class এর join Method দিয়ে কিভাবে inner join করা যায়, তা লক্ষ্য করুন। আপনার 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')
            ->join('contacts', 'students.id', '=', 'contacts.student_id')
            ->join('course_choice', 'students.id', '=', 'course_choice.student_id')
            ->join('courses', 'students.id', '=', 'course_choice.student_id')
            ->select('students.id','students.name','courses.course_name','contacts.phone','contacts.email')
            ->get();

            echo "<pre>";
            print_r($students);
            echo "</pre>";
	}
}

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

Laravel Inner Join

Laravel Inner Join

Left Join Clause

আপনি যদি inner join এর পরিবর্তে left join করতে চান , তাহলে আপনাকে join method এর পরিবর্তে leftJoin Method টি ব্যবহার করতে হবে। এর জন্য leftJoin Method এর প্রথম argument এ আপনাকে Database এর table নাম দিতে হবে, আর বাকি argument গুলোতে যেইসব column এর ভিত্তিতে leftFoin করব তার নাম দিতে হবে আপনার 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')
            ->leftJoin('contacts', 'students.id', '=', 'contacts.student_id')
            ->select('students.id','students.name','contacts.phone','contacts.email')
            ->get();

            echo "<pre>";
            print_r($students);
            echo "</pre>";
	}
}

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

Larvel Left Join

Larvel Left Join

Cross Join Clause

আপনি যদি cross join করতে চান , তাহলে আপনাকে crossJoin Method টি ব্যবহার করতে হবে। আপনার 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')
            ->crossJoin('courses')
            ->get();

            echo "<pre>";
            print_r($students);
            echo "</pre>";
	}
}

Advanced Join Clauses

আপনি চাইলে Laravel Query Builder দিয়ে আরো advance join query রান করতে পারেন, আর এর জন্য আপনার join Method এর দ্বিতীয় Argument হিসেবে একটা closure পাঠাতে হবে। তখন closure টি একটি joinClouse অবজেক্ট রিসিভ করবে, যেটি পরবর্তী constraints কে allow করবে। আরো ভালো ভাবে বুঝার জন্য আপনার 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')
        ->join('contacts', function ($join) {
            $join->on('students.id', '=', 'contacts.student_id')
                 ->where('contacts.student_id', '>', 3);
        })
        ->get();

            echo "<pre>";
            print_r($students);
            echo "</pre>";
	}
}

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

advance join clause

advance join clause

ব্যাখ্যা: এখানে যেই সব ছাত্রদের id 3 এর চেয়ে বেশি শুধু তাদেরকে দেখাবে , আর এর জন্য আমরা where clause ব্যবহার করেছি, where clause এ আপনাকে তিনটি argument দিতে হবে , প্রথম argument এ column এর নাম দিতে হবে, দ্বিতীয় argument এ operator দিতে হবে , সর্বশেষ তৃতীয় argument এ column এর সাথে compare করার মান দিতে হবে।

Unions

Laravel Framework এ Query Builder দিয়ে আপনি দুটি query এর মধ্যে খুব সহজে Union করতে পারেন। আরো ভালো ভাবে বুঝার জন্য আপনার getqueryController class এ নিচের কোডটি লিখুন :

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class getqueryController extends Controller
{
	public function index(){
		
		$first = DB::table('contacts')
            ->whereNull('phone');

		$students = DB::table('contacts')
            ->whereNull('email')
            ->union($first)
            ->get();

            echo "<pre>";
            print_r($students);
            echo "</pre>";
	}
}

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

Laravel Union Example

Laravel Union Example

এই ক্যাটাগরির অন্যান্য পোস্ট:

Masud Alam
আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ৮ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। বিশেষ ভাবে বাংলাদেশের ১০০ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ৫২ জন ই আমার হাতে জেন্ড সার্টিফাইড হয়েছে। বর্তমানে TechBeeo Software Company তে সিইও হিসাবে আছি । পাশাপাশি w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -7 Engineering কোর্স করাই। আর w3programmers.com সাইট টি আমার।

Leave a Reply

Your email address will not be published. Required fields are marked *