<?php
/**
* @author Tadochi aka Patsifist <[email protected]>
* @version 0.1
* Класс Query builder. Наверное и так понятно для чего она
* Пример / Example
* Core::get('query_builder');
* $builder = new Query_builder;
* $builder->
* select('id', 'nick')->
* from('user')->
* where('id', '=', '1')->
* or_where('id', '=', '2')->
* and_where('nick', 'in', '1,2,3,4,5');
* Чтобы сделать запрос
* $sql->query($builder->query);
*/
Class Query_builder
{
/**
* $var $operation string Содержит название операции
*/
public $operation;
/**
* $var operands array все допустимые операнды
*/
public $operands = array('=', '>', '<', '<>', '!=', '<=', '>=', 'LIKE', 'IN', '<>');
/**
* $var query содержит сам запрос
*/
public $query;
/**
* Хелпер для установки типа операции
*/
public function operation($operation)
{
if (empty($this->operation))
$this->operation = $operation;
else
exit('Тип операции уже определен');
}
/**
* Хелпер - конструктор строки с полями
*/
public function fields_maker(array $fields, $set = false)
{
$i = 0;
$count = count($fields);
$string = null;
if ($set)
{
foreach ($fields as $field => $value)
{
$string .= '`' . $field . "` = '".$value."'" . (++$i != $count ? ', ' : null);
}
}
else
{
foreach ($fields as $field)
{
$string .= '`' . $field . '`' . (++$i != $count ? ', ' : null);
}
}
//$this->query = ' SET '.$string;
return $string;
}
/*
* Хелпер констуктор условий
*/
public function cond_maker($cond1, $operand, $cond2)
{
if (in_array($operand, $this->operands))
{
if ($operand == 'IN')
return "`".$cond1."` in('".$cond2."') ";
else
return "`".$cond1."` ".$operand." '".$cond2."' ";
}
else
exit('Неизвестный операнд '. $operand . PHP_EOL . '<br />Список операндов: '. implode(',', $this->operands));
}
/**
* Хелпер для сброса запроса
*/
public function reset()
{
$this->query = $this->operation = null;
return $this;
}
// Operations
public function select($fields)
{
$this->operation('SELECT');
$args = func_get_args();
$this->query = 'SELECT ' . (is_array($args[0]) ? $this->fields_maker($args[0]) : $this->fields_maker($args)) . ' ';
return $this;
}
public function delete($table)
{
$this->operation('DELETE');
$this->query = 'DELETE FROM `'.$table.'` ';
return $this;
}
public function update($table)
{
$this->operation('UPDATE');
$this->query = 'UPDATE `'.$table.'` ';
return $this;
}
public function insert($table)
{
$this->operation('INSERT');
$this->query = 'INSERT INTO `'.$table.'` ';
return $this;
}
public function from($table)
{
strtoupper($this->operation) == 'SELECT' ? $this->query .= ' FROM `' . $table . '` ' : null;
return $this;
}
public function order($field, $type)
{
if (strtoupper($this->operation) == 'SELECT')
$this->query .= 'ORDER BY `'.$field.'` ' . (strtoupper($type) == 'DESC' ? 'DESC' : 'ASC') . ' ';
return $this;
}
public function limit($limit)
{
$this->query .= $this->operation != 'INSERT' ? 'LIMIT ' . $limit : null;
return $this;
}
public function set($args)
{
$set = $this->operation == 'INSERT' || $this->operation = 'UPDATE';
$this->query .= ' SET ' . $this->fields_maker($args, $set);
return $this;
}
public function where($cond1, $operand, $cond2)
{
$this->query .= $this->operation != 'INSERT' ? 'WHERE ' . $this->cond_maker($cond1, strtoupper($operand), $cond2) : null;
return $this;
}
public function or_where($cond1, $operand, $cond2)
{
$this->query .= $this->operation != 'INSERT' ? 'OR ' . $this->cond_maker($cond1, strtoupper($operand), $cond2) : null;
return $this;
}
public function and_where($cond1, $operand, $cond2)
{
$this->query .= $this->operation != 'INSERT' ? 'AND ' . $this->cond_maker($cond1, strtoupper($operand), $cond2) : null;
return $this;
}
}