PHP Object Oriented Programming
Building a Dynamic Query Builder Using PHP __call and __callStatic Methods

ওয়েব ডেভেলপমেন্টের ডাইনামিক ল্যান্ডস্কেপে, ফ্লেক্সিবল এবং শক্তিশালী ডাটাবেস Query Builder তৈরি করা শক্তিশালী অ্যাপ্লিকেশন তৈরির একটি ভিত্তি। পিএইচপি, একটি বহুমুখী সার্ভার-সাইড স্ক্রিপ্টিং ল্যাঙ্গুয়েজ, ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য বিভিন্ন পদ্ধতির প্রস্তাব করে। এমন একটি পদ্ধতি যা এর elegance এবং expressiveness অর্থাৎ অভিব্যক্তির জন্য দাঁড়িয়েছে তা হল __call এবং __callStatic magic methods এর ব্যবহার।
এমন একটি সিনারিও কল্পনা করুন যেখানে এসকিউএল কোয়েরি তৈরি করা একটি মেথড কল করার মতোই স্বজ্ঞাত হয়ে ওঠে। PHP এর ম্যাজিক মেথড গুলো ব্যবহার করে আপনি একটি QueryBuilder ক্লাস তৈরি করতে পারেন। এই আর্টিকেলে , আমরা একটি Dynamic Query Builder ডিজাইন করার সময় এর জটিলতাগুলিকে সমাধান করতে __call এবং __callStatic ম্যাজিক মেথডকে কাজে লাগাব।
SELECT কোয়েরি তৈরির প্রাথমিক বিষয়গুলি থেকে শুরু করে advance ফীচারগুলি যেমন ordering, limiting, এবং টেবিল গুলো জয়েন দেওয়া, এই আর্টিকেলটি টি আপনাকে একটি বহুমুখী এবং user-friendly query builder তৈরির মাধ্যমে গাইড করবে৷ আমরা আপনার ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি পরিষ্কার এবং অভিব্যক্তিপূর্ণ সিনট্যাক্স প্রদান করে বিভিন্ন ডাটাবেস ক্রিয়াকলাপগুলিকে গতিশীলভাবে পরিচালনা করার পিছনের ম্যাজিকটি উন্মোচন করব।
আপনি একজন অভিজ্ঞ ডেভেলপার যা আপনার টুলকিট বাড়ানোর জন্য খুঁজছেন বা dynamic query building এর principles গুলি উপলব্ধি করতে আগ্রহী একজন নবাগত হোক না কেন, এই যাত্রা আপনাকে আপনার ডাটাবেস ইন্টারঅ্যাকশনকে স্ট্রিমলাইন করার জন্য নলেজ এবং স্কিল দিয়ে সজ্জিত করবে। চলুন একটি ডায়নামিক কোয়েরি বিল্ডার তৈরির শিল্পে গভীরভাবে চিন্তা করি এবং দক্ষ এবং পঠনযোগ্য ডাটাবেস কোয়েরি তৈরির জন্য পিএইচপি-এর ম্যাজিক মেথড গুলোকে ব্যবহার করি।
<?php
class QueryBuilder
{
private $pdo;
private $table;
private $rawSQL;
private $select=[];
private $orderBy=[];
private $inRandomOrder;
private $limit;
private $offset;
private $groupBy=[];
private $having=[];
private $havingBetween=[];
private $where=[];
private $orWhere=[];
private $whereBetween=[];
private $whereNotBetween=[];
private $whereBetweenColumns = [];
private $whereNotBetweenColumns=[];
private $whereIn=[];
private $whereNotIn=[];
private $whereNull=[];
private $whereNotNull=[];
private $whereDate=[];
private $whereMonth=[];
private $whereDay=[];
private $whereYear=[];
private $whereTime=[];
private $whereColumn=[];
private $innerJoins=[];
private $leftJoins=[];
private $rightJoins=[];
public function __construct(PDO $pdo, $table)
{
$this->pdo=$pdo;
$this->table=$table;
}
public function select(...$columns)
{
$this->select=$columns;
return $this;
}
public function innerJoin($table, $on, $alias = null)
{
$this->innerJoins[] = compact('table', 'on', 'alias');
return $this;
}
public function leftJoin($table, $on, $alias = null)
{
$this->leftJoins[] = compact('table', 'on', 'alias');
return $this;
}
public function rightJoin($table, $on, $alias = null)
{
$this->rightJoins[] = compact('table', 'on', 'alias');
return $this;
}
public function where($column, $operator, $value=null)
{
if($value === null)
{
$value = $operator;
$operator= '=';
}
$this->where[]=compact('column', 'operator', 'value');
return $this;
}
public function orWhere($column, $operator, $value=null)
{
if($value === null)
{
$value = $operator;
$operator= '=';
}
$this->orWhere[]=compact('column', 'operator', 'value');
return $this;
}
public function whereBetween($column, array $values)
{
$this->whereBetween [] = compact('column', 'values');
return $this;
}
public function whereNotBetween($column, array $values)
{
$this->whereNotBetween [] = compact('column', 'values');
return $this;
}
public function whereBetweenColumns($column, array $rangeColumns)
{
$this->whereBetweenColumns[]=compact('column','rangeColumns');
return $this;
}
public function whereNotBetweenColumns($column, array $rangeColumns)
{
$this->whereNotBetweenColumns[]=compact('column','rangeColumns');
return $this;
}
public function whereIn($column, array $values){
$this->whereIn[]=compact('column','values');
return $this;
}
public function whereNotIn($column, array $values){
$this->whereNotIn[]=compact('column','values');
return $this;
}
public function whereNull($column){
$this->whereNull[]=$column;
return $this;
}
public function whereNotNull($column){
$this->whereNotNull[]=$column;
return $this;
}
public function whereDate($column, $date)
{
$this->whereDate[]=compact('column','date');
return $this;
}
public function whereMonth($column, $month)
{
$this->whereMonth[]=compact('column','month');
return $this;
}
public function whereDay($column, $day)
{
$this->whereDay[]=compact('column','day');
return $this;
}
public function whereYear($column, $year)
{
$this->whereYear[]=compact('column','year');
return $this;
}
public function whereTime($column, $operator, $time)
{
$this->whereTime[]=compact('column','operator','time');
return $this;
}
public function whereColumn($firstColumn, $operatorOrSecondColumn, $secondColumn=null)
{
if($secondColumn===null)
{
$operator= '=';
$secondColumn=$operatorOrSecondColumn;
}else{
$operator = $operatorOrSecondColumn;
}
$this->whereColumn[] = compact('firstColumn','operator','secondColumn');
return $this;
}
public function orderBy($column, $direction = 'asc')
{
$this->orderBy[]=compact('column','direction');
return $this;
}
public function inRandomOrder()
{
$this->inRandomOrder = true;
return $this;
}
public function limit($count)
{
$this->limit=$count;
return $this;
}
public function skip($offset)
{
$this->offset=$offset;
return $this;
}
public function take($count)
{
$this->limit($count);
return $this;
}
public function count()
{
$this->select('COUNT(*) as count');
$result = $this->limit(1)->get();
return isset($result[0]['count'])? (int) $result[0]['count']:0;
}
public function find($findColumn, $findValue)
{
$this->where($findColumn,$findValue);
$result = $this->get();
return !empty($result) ? $result[0] : null;
}
public function value($column)
{
$this->select($column);
$result= $this->limit(1)->get();
return isset($result[0][$column])?$result[0][$column]:null;
}
public function max($column)
{
$this->select("MAX($column) as max");
$result = $this->limit(1)->get();
return isset($result[0]['max'])?$result[0]['max']:null;
}
public function avg($column)
{
$this->select("AVG($column) as avg");
$result = $this->limit(1)->get();
return isset($result[0]['avg'])?$result[0]['avg']:null;
}
public function groupBy(...$columns)
{
$this->groupBy = array_merge($this->groupBy, $columns);
return $this;
}
public function having($column, $operator, $value)
{
$this->having[] = compact('column','operator','value');
return $this;
}
public function havingBetween($column, array $values)
{
$this->havingBetween[]=compact('column','values');
return $this;
}
public function get()
{
/* $this->prepareRawSQL();
return $this->rawSQL; */
$sql="SELECT ";
if(!empty($this->select))
{
$sql .= implode(", ",$this->select);
}else{
$sql .= "*";
}
$sql .= " FROM {$this->table}";
if(!empty($this->innerJoins))
{
foreach($this->innerJoins as $join)
{
$sql .=" INNER JOIN {$join['table']}";
if($join['alias'])
{
$sql .=" AS {$join['alias']}";
}
$sql .=" ON {$join['on']}";
}
}
if(!empty($this->leftJoins))
{
foreach($this->leftJoins as $join)
{
$sql .=" LEFT JOIN {$join['table']}";
if($join['alias'])
{
$sql .=" AS {$join['alias']}";
}
$sql .=" ON {$join['on']}";
}
}
if(!empty($this->rightJoins))
{
foreach($this->rightJoins as $join)
{
$sql .=" RIGHT JOIN {$join['table']}";
if($join['alias'])
{
$sql .=" AS {$join['alias']}";
}
$sql .=" ON {$join['on']}";
}
}
$params=[];
if(!empty($this->orWhere))
{
$sql .=' OR';
foreach($this->orWhere as $condition)
{
$sql .= " {$condition['column']} {$condition['operator']} :{$condition['column']} OR";
$params[":{$condition['column']}"]=$condition['value'];
}
$sql =rtrim($sql, ' OR');
//Reset Where
$this->orWhere = [];
}
if(!empty($this->whereBetween))
{
$sql .=" WHERE";
foreach($this->whereBetween as $condition){
$sql .=" {$condition['column']} BETWEEN :{$condition['column']}_start AND :{$condition['column']}_end AND";
$params[":{$condition['column']}_start"] = $condition['values'][0];
$params[":{$condition['column']}_end"] = $condition['values'][1];
}
$sql = rtrim($sql, " AND");
}
if(!empty($this->whereNotBetween))
{
$sql .=" WHERE";
foreach($this->whereNotBetween as $condition){
$sql .=" {$condition['column']} NOT BETWEEN :{$condition['column']}_start AND :{$condition['column']}_end AND";
$params[":{$condition['column']}_start"] = $condition['values'][0];
$params[":{$condition['column']}_end"] = $condition['values'][1];
}
$sql = rtrim($sql, " AND");
}
if(!empty($this->whereBetweenColumns))
{
$sql .=" WHERE";
foreach($this->whereBetweenColumns as $condition)
{
$sql .=" {$condition['column']} BETWEEN {$condition['rangeColumns'][0]} AND {$condition['rangeColumns'][1]} AND";
}
$sql = rtrim($sql, ' AND');
}
if(!empty($this->whereNotBetweenColumns))
{
$sql .=" WHERE";
foreach($this->whereNotBetweenColumns as $condition)
{
$sql .=" {$condition['column']} NOT BETWEEN {$condition['rangeColumns'][0]} AND {$condition['rangeColumns'][1]} AND";
}
$sql = rtrim($sql, ' AND');
}
if(!empty($this->whereIn))
{
$sql .=' WHERE ';
foreach($this->whereIn as $condition)
{
$sql .="{$condition['column']} IN (:" . implode(', :', $condition['values']) .") AND";
foreach( $condition['values'] as $value)
{
$params[":$value"]=$value;
}
}
$sql = rtrim($sql, ' AND');
}
if(!empty($this->whereNotIn))
{
$sql .=' WHERE ';
foreach($this->whereNotIn as $condition)
{
$sql .="{$condition['column']} NOT IN (:" . implode(', :', $condition['values']) .") AND";
foreach( $condition['values'] as $value)
{
$params[":$value"]=$value;
}
}
$sql = rtrim($sql, ' AND');
}
if(!empty($this->whereNull))
{
$sql .=" WHERE ";
foreach($this->whereNull as $column)
{
$sql .= "{$column} IS NULL AND";
}
$sql = rtrim($sql, " AND");
}
if(!empty($this->whereNotNull))
{
$sql .=" WHERE ";
foreach($this->whereNotNull as $column)
{
$sql .= "{$column} IS NOT NULL AND";
}
$sql = rtrim($sql, " AND");
}
if(!empty($this->whereDate))
{
$sql .=' WHERE ';
foreach($this->whereDate as $condition)
{
$sql .="DATE({$condition['column']}) = '{$condition['date']}' AND";
}
$sql =rtrim($sql, ' AND');
}
if(!empty($this->whereMonth))
{
$sql .=' WHERE ';
foreach($this->whereMonth as $condition)
{
$sql .="MONTH({$condition['column']}) = '{$condition['month']}' AND";
}
$sql =rtrim($sql, ' AND');
}
if(!empty($this->whereDay))
{
$sql .=' WHERE ';
foreach($this->whereDay as $condition)
{
$sql .="DAY({$condition['column']}) = '{$condition['day']}' AND";
}
$sql =rtrim($sql, ' AND');
}
if(!empty($this->whereYear))
{
$sql .=' WHERE ';
foreach($this->whereYear as $condition)
{
$sql .="YEAR({$condition['column']}) = '{$condition['year']}' AND";
}
$sql =rtrim($sql, ' AND');
}
if(!empty($this->whereTime))
{
$sql .=' WHERE ';
foreach($this->whereTime as $condition)
{
$sql .="TIME({$condition['column']}) {$condition['operator']} '{$condition['time']}' AND";
}
$sql =rtrim($sql, ' AND');
}
if(!empty($this->whereColumn))
{
$sql .=' WHERE ';
foreach($this->whereColumn as $condition)
{
$sql .="{$condition['firstColumn']} {$condition['operator']} {$condition['secondColumn']} AND";
}
$sql = rtrim($sql, ' AND');
}
if(isset($this->limit))
{
$sql .=" LIMIT {$this->limit}";
}
if(isset($this->offset))
{
$sql .=" OFFSET {$this->offset}";
}
if (!empty($this->groupBy)) {
$sql .= ' GROUP BY ' . implode(', ', $this->groupBy);
}
if(!empty($this->orderBy))
{
$sql .=' ORDER BY ';
foreach($this->orderBy as $order)
{
$sql .= "{$order['column']} {$order['direction']}, ";
}
$sql =rtrim($sql, ', ');
}elseif($this->inRandomOrder){
$sql = "SELECT * FROM ({$sql} ORDER BY RAND()) AS subquery";
}
//Add HAVING clause
if(!empty($this->having))
{
$sql .=' HAVING ';
foreach($this->having as $condition)
{
$sql .= "{$condition['column']} {$condition['operator']} '{$condition['value']}' AND ";
}
$sql = rtrim($sql, 'AND ');
}
//Add HAVING BETWEEN clause
if(!empty($this->havingBetween))
{
$sql .=' HAVING ';
foreach($this->havingBetween as $condition)
{
$column = $condition['column'];
$values = $condition['values'];
$sql .= "{$column} BETWEEN {$values[0]} AND {$values[1]} AND ";
}
$sql = rtrim($sql, 'AND ');
}
echo $sql;
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function __call($method,$args)
{
throw new BadFunctionCallException("Method {$method}() does not exist");
}
public static function __callStatic($method,$args)
{
throw new BadFunctionCallException("Static Method {$method}() does not exist");
}
public function dumpRawSQL()
{
$this->prepareRawSQL();
echo $this->rawSQL;
}
private function prepareRawSQL()
{
$sql="SELECT ";
//Add Selected Columns
if(!empty($this->select))
{
$sql .= implode(", ",$this->select);
}else{
$sql .= "*";
}
//Add FROM clause
$sql .= " FROM {$this->table}";
//Add ORDER BY clause
if(!empty($this->orderBy))
{
$sql .=' ORDER BY ';
foreach($this->orderBy as $order)
{
$sql .= "{$order['column']} {$order['direction']}, ";
}
$sql =rtrim($sql, ', ');
}
$this->rawSQL=$sql;
}
}
আমাদের dbconfig.php ফাইলের কোড গুলো হবে নিম্নরুপঃ
<?php
return [
"host" => "localhost",
"dbname" => "e_commerce",
"username" => "root",
"password" => "",
];
আমাদের Db.php ফাইলের কোড গুলো হবে নিম্নরুপঃ
<?php
class Db
{
private static $pdo;
public static function connect(){
if(!isset(self::$pdo))
{
extract(require_once 'dbConfig.php');
$dsn="mysql:host=$host;dbname=$dbname";
try{
self::$pdo=new PDO($dsn,$username,$password,[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
}catch (PDOException $e){
throw new RuntimeException("Database connectio error: ".$e->getMessage());
}
}
return self::$pdo;
}
public static function table($tableName)
{
return new QueryBuilder(self::connect(),$tableName);
}
public function __call($method,$args)
{
throw new BadFunctionCallException("Method {$method}() does not exist");
}
public static function __callStatic($method,$args)
{
throw new BadFunctionCallException("Static Method {$method}() does not exist");
}
}
আমাদের testQuery.php ফাইলের কোড গুলো হবে নিম্নরুপঃ
<?php
require_once "Db.php";
require_once 'QueryBuilder.php';
try{
//$users=DB::table('users');
//$users->select('name','age')->dumpRawSQL();
//$allUsers=$users->select('name','age')->get();
//$allUsers=$users->select('name','email','age','status')->get();
/* $allUsers=$users->get();
print_r($allUsers); */
// Retrive all rows with orderBy ASC
//$allUsersWithOrderBy=$users->orderBy('age')->get();
/* $allUsersWithOrderBy=$users->select('name','age')->orderBy('age')->get();
print_r($allUsersWithOrderBy);
*/ //$users->orderBy('name','DESC')->dumpRawSQL();
// Retrive all rows with orderBy DESC
/* $allUsersWithOrderBy=$users->orderBy('age', 'DESC')->get();
print_r($allUsersWithOrderBy);
*/
// Retrive all rows with MultiColumn orderBy
/* $orderByMultiColumn=$users
->orderBy('name','DESC')
->orderBy('age','asc')
->get();
print_r($orderByMultiColumn); */
//$orderBywithSelectedColumn=$users->select("id","name","age","email")->orderBy("age")->get();
/* $randomOrder=$users->select("id","name","age","email")->inRandomOrder()->get();
print_r($randomOrder);
*/
//$limitedUsers = $users->limit(3)->get();
//print_r($limitedUsers);
//echo $users->limit(3)->dumpRawSQL();
/* $limitedUsersWithSkip=$users->skip(2)->take(3)->get();
print_r($limitedUsersWithSkip); */
//echo $users->count();
/* $users=DB::table("users");
$result=$users
->select('age','COUNT(*) as total')
->groupBy('age')
->get();
print_r($result); */
//Before use below example, please connect classicmodels database
/* $orders = Db::table('orders');
$result = $orders
->select('status', 'COUNT(*) as total')
->groupBy('status')
->get();
print_r($result);
*/
/* $orders = Db::table('orders');
$result = $orders
->select('status', 'COUNT(*) as total')
->groupBy('status')
->having('total', '>', 4)
->get();
print_r($result);
*/
/* $orders = Db::table('orders');
$result = $orders
->select('YEAR (orderDate) AS year', "COUNT(orderNumber) as 'Total Order'")
->groupBy('year')
->get();
print_r($result); */
/* $orders = Db::table('orders');
$result = $orders
->select('YEAR (orderDate) AS year', "COUNT(orderNumber) as 'total_order'")
->groupBy('year')
->having('year','>','2003')
->get();
print_r($result); */
/* $orders = Db::table('orders');
$result = $orders
->select('YEAR (orderDate) AS year', "COUNT(orderNumber) as 'total_order'")
->groupBy('year')
->havingBetween('year',[2003,2004])
->get();
print_r($result); */
/* $orders = Db::table('orders');
$report=$orders
->select('customerNumber','COUNT(customerNumber) as number_of_orders')
->groupBy('customerNumber')
->having('number_of_orders','>',3)
->get();
print_r($report); */
/* $orders = Db::table('orders');
$report=$orders
->select('customerNumber','COUNT(customerNumber) as number_of_orders')
->groupBy('customerNumber')
->havingBetween('number_of_orders',[5,6])
->get();
print_r($report); */
//$customers=Db::table('customers');
//$whereFilter=$customers->where('customerNumber', 114)->get();
/* $whereFilter=$customers
->select('customerNumber','customerName','phone','country','creditLimit')
->where('creditLimit', '>', 50000)
->where('country','France')
->get(); */
/* $whereFilter=$customers
->select('customerNumber','customerName','phone','country','creditLimit')
->where('creditLimit', '>', 50000)
->orWhere('country','France')
->get(); */
//print_r($whereFilter);
/* $whereBetweenFilter=$customers
->select('customerNumber','customerName','creditLimit')
->whereBetween('creditLimit',[25000,50000])
->get();
print_r($whereBetweenFilter); */
/* $whereBetweenFilter=$customers
->select('customerNumber','customerName','creditLimit','country')
->whereNotBetween('creditLimit',[25000,100000])
->get();
print_r($whereBetweenFilter); */
//$patients=Db::table('patients');
/* $result=$patients
->select('name','weight','minimum_allowed_weight','maximum_allowed_weight')
->whereBetweenColumns('weight',['minimum_allowed_weight','maximum_allowed_weight'])
->get();
print_r($result); */
/* $result=$patients
->select('name','weight','minimum_allowed_weight','maximum_allowed_weight')
->whereNotBetweenColumns('weight',['minimum_allowed_weight','maximum_allowed_weight'])
->get();
print_r($result); */
/* $sql="SELECT * FROM customers WHERE country in('USA','UK','France')";
$sql = "SELECT * FROM customers WHERE country ='USA' OR country ='UK' OR country='France'";
*/
/* $whereInFilter=$customers
->select('customerName','country','city')
->whereIn('country',['France','Germany','Spain'])
->get();
print_r($whereInFilter); */
/* $whereNotInFilter=$customers
->select('customerName','country','city')
->whereNotIn('country',['France','Germany','Spain','USA'])
->get();
print_r($whereNotInFilter); */
/* $whereNull=$customers
->select('customerName','country','state','city')
->whereNull('state')
->get();
print_r($whereNull); */
/* $whereNotNull=$customers
->select('customerName','country','state','city')
->whereNotNull('state')
->get();
print_r($whereNotNull);
*/
//$orders=Db::table('orders');
/* $whereDateFilter=$orders
->select('orderNumber','customerNumber','orderDate','shippedDate')
->whereDate('orderDate','2005-04-15')
->get();
print_r($whereDateFilter); */
/* $whereMonthFilter=$orders
->select('orderNumber','customerNumber','orderDate','shippedDate')
->whereMonth('orderDate','04')
->get();
print_r($whereMonthFilter); */
/* $whereDayFilter=$orders
->select('orderNumber','customerNumber','orderDate','shippedDate')
->whereDay('orderDate','15')
->get();
print_r($whereDayFilter); */
/* $whereYearFilter=$orders
->select('orderNumber','customerNumber','orderDate','shippedDate')
->whereYear('orderDate','2004')
->get();
print_r($whereYearFilter); */
//$users=Db::table("users");
/* $whereTimeFilter=$users
->whereTime('created_at','=','17:15:24')
->get();
print_r($whereTimeFilter); */
/* $whereColumnFilter=$users
->whereColumn('created_at','updated_at')
->get(); */
/* $whereColumnFilter=$users
->whereColumn('created_at','<','updated_at')
->get();
*/
/* $patients=Db::table("patients");
$whereColumnFilter=$patients
->whereColumn('weight','<','minimum_allowed_weight')
->get();
print_r($whereColumnFilter); */
/* $users=Db::table("users")
->count();
echo $users; */
/* $users=Db::table('users')
->where("email","bob@example.com")->value('name'); */
//echo Db::table('users')->avg('age');
/* INNER JOIN EXAMPLES */
//Example Usage 1:
/*
SELECT
status,
SUM(quantityOrdered*priceEach) AS amount,
quantityOrdered as 'Total Order'
FROM
`orders`
INNER JOIN
orderdetails
ON
orders.orderNumber=orderdetails.orderNumber
GROUP BY status;
*/
/* $query1=Db::table('orders')
->select('status', 'SUM(quantityOrdered*priceEach) AS Amount', 'quantityOrdered')
->innerJoin('orderdetails','orders.orderNumber = orderdetails.orderNumber')
->groupBy('status')
->get();
print_r($query1); */
//Example Usage: 2
/*
SELECT
YEAR(orderDate) AS year,
SUM(quantityOrdered*priceEach) AS 'Total Amount',
SUM(quantityOrdered) as 'Total Order'
FROM
`orders`
INNER JOIN
orderdetails
ON
orders.orderNumber=orderdetails.orderNumber
WHERE status = 'Shipped'
GROUP BY YEAR(orderDate);
*/
/* $query2=Db::table('orders')
->select("YEAR(orderDate) AS year", "SUM(quantityOrdered*priceEach) AS 'Total Amount'", "SUM(quantityOrdered) as 'Total Order'")
->innerJoin('orderdetails','orders.orderNumber = orderdetails.orderNumber')
->where('status','Shipped')
->groupBy('year')
->get();
print_r($query2); */
//Example Usage: 3
/*
SELECT
YEAR(orderDate) AS year,
SUM(quantityOrdered*priceEach) AS total_amount,
SUM(quantityOrdered) as total_order
FROM
`orders`
INNER JOIN
orderdetails
ON
orders.orderNumber=orderdetails.orderNumber
WHERE status = 'Shipped'
GROUP BY year
HAVING year>2003;
*/
/* $query3=Db::table('orders')
->select("YEAR(orderDate) AS year", "SUM(quantityOrdered*priceEach) AS 'Total Amount'", "SUM(quantityOrdered) as 'Total Order'")
->innerJoin('orderdetails','orders.orderNumber = orderdetails.orderNumber')
->where('status','Shipped')
->groupBy('year')
->having('year','>',2003)
->get();
print_r($query3); */
//Example Usage: 4
/*
SELECT
YEAR(orderDate) AS year,
status,
SUM(quantityOrdered*priceEach) AS total_amount,
SUM(quantityOrdered) as total_order
FROM
`orders`
INNER JOIN
orderdetails
ON
orders.orderNumber=orderdetails.orderNumber
GROUP BY year,status
ORDER BY year;
*/
/* $query4 = Db::table('orders')
->select('YEAR(orderDate) AS year', 'status', 'SUM(quantityOrdered * priceEach) AS total')
->innerJoin('orderdetails', 'orders.orderNumber = orderdetails.orderNumber')
->groupBy('year', 'status')
->orderBy('year')
->get();
*/
//print_r($query4);
// Example Usage: 5
/* SELECT
a.orderNumber,
status,
SUM(priceEach*quantityOrdered) AS total
FROM
orderdetails a
INNER JOIN
orders b ON b.orderNumber = a.orderNumber
GROUP BY
a.orderNumber,
status
HAVING
status = 'Shipped'
AND
total>1500; */
/* $query5=Db::table('orderdetails a')
->select('a.orderNumber','status','SUM(priceEach * quantityOrdered) total')
->innerJoin('orders b', 'b.orderNumber = a.orderNumber')
->groupBy('orderNUmber','status')
->having('status','=','Shipped')
->having('total','<',1500)
->get();
print_r($query5); */
// Example Usage: 6
/*
SELECT
productCode, productName, textDescription
FROM
products t1
INNER JOIN
productlines t2 ON t1.productLine=t2.productLine;
*/
/* $query6=Db::table('products t1')
->select('productCode', 'productName', 'textDescription')
->innerJoin('productlines t2','t2.productLine = t2.productLine')
->get();
print_r($query6); */
// Example Usage: 7
/* SELECT
productCode, productName, textDescription
FROM
products
INNER JOIN
productlines ON products.productLine=productlines.productLine */;
/* $query7=Db::table('products')
->select('productCode', 'productName', 'textDescription')
->innerJoin('productlines','products.productLine = productlines.productLine')
->get();
print_r($query7);
*/
// Example Usage: 8
/*
SELECT
orders.orderNumber,
orders.orderDate,
orderdetails.orderLineNumber,
products.productName,
orderdetails.quantityOrdered,
orderdetails.priceEach,
SUM(orderdetails.quantityOrdered*orderdetails.priceEach) AS total
FROM
orders
INNER JOIN orderdetails
ON orders.orderNumber = orderdetails.orderNumber
INNER JOIN products
ON orderdetails.productCode = products.productCode
GROUP BY
orders.orderNumber,
orders.orderDate,
orderdetails.orderLineNumber,
products.productName;
*/
/* $query8=Db::table('orders')
->select('customers.customerNumber','customers.customerName','orders.orderNumber','orders.orderDate','orderdetails.orderLineNumber','products.productName','orderdetails.quantityOrdered','orderdetails.priceEach','SUM(orderdetails.quantityOrdered*orderdetails.priceEach) AS total')
->innerJoin('orderdetails','orders.orderNumber=orderdetails.orderNumber')
->innerJoin('products','orderdetails.productCode = products.productCode')
->innerJoin('customers','orders.customerNumber=customers.customerNumber')
->groupBy('orders.orderNumber','orders.orderDate','orderdetails.orderLineNumber','products.productName')
->orderBy('orders.orderNumber')
->get(); */
//Example Usage of leftJoin
/*
SELECT
customers.customerNumber,
customerName,
orderNumber,
status
FROM
customers
LEFT JOIN
orders
ON customers.customerNumber=orders.customerNumber
WHERE orderNumber is NULL
ORDER BY `orders`.`orderNumber` DESC;
*/
/* $query9=Db::table('customers')
->select('customers.customerNumber','customerName','orderNumber','status')
->RightJoin('orders','customers.customerNumber=orders.customerNumber')
->get();
print_r($query9); */
/*
SELECT
e.firstName,
e.lastName,
customerNumber,
customerName
FROM
employees e
LEFT JOIN
customers c
ON
e.employeeNumber=c.salesRepEmployeeNumber
ORDER BY `c`.`customerName` ASC;
*/
$query10=Db::table("employees")
->select("firstName","lastName","customerName",'checkNumber','amount')
->leftJoin("customers","employeeNumber=salesRepEmployeeNumber")
->rightJoin("payments","payments.customerNumber=customers.customerNumber")
->orderBy("customerName")
->orderBy("checkNumber")
->get();
print_r($query10);
}catch (PDOException $e){
echo "Error: ".$e->getMessage();
}
উপরের ক্লাসটি ব্যবহার করতে নিম্নোক্ত টেবিল গুলো এবং তার ডেটা গুলো ব্যবহার করতে পারেন :
https://github.com/masudeden/sample-database