2018-01-23 11:22:23 -05:00
|
|
|
<?php declare(strict_types=1);
|
|
|
|
/**
|
|
|
|
* Query
|
|
|
|
*
|
|
|
|
* SQL Query Builder / Database Abstraction Layer
|
|
|
|
*
|
|
|
|
* PHP version 7.1
|
|
|
|
*
|
2018-01-24 15:03:41 -05:00
|
|
|
* @package Query
|
|
|
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
2018-01-23 11:22:23 -05:00
|
|
|
* @copyright 2012 - 2018 Timothy J. Warren
|
2018-01-24 15:03:41 -05:00
|
|
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
|
|
|
* @link https://git.timshomepage.net/aviat4ion/Query
|
2018-01-23 11:22:23 -05:00
|
|
|
*/
|
2018-01-24 15:03:41 -05:00
|
|
|
|
2018-01-23 11:22:23 -05:00
|
|
|
namespace Query;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Query builder state
|
|
|
|
*/
|
|
|
|
class State {
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
// ! SQL Clause Strings
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compiled 'select' clause
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $selectString = '';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compiled 'from' clause
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $fromString = '';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compiled arguments for insert / update
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $setString = '';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Order by clause
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $orderString = '';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Group by clause
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $groupString = '';
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
// ! SQL Clause Arrays
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Keys for insert/update statement
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $setArrayKeys = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Key/val pairs for order by clause
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $orderArray = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Key/val pairs for group by clause
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $groupArray = [];
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
// ! Other Class vars
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Values to apply to prepared statements
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $values = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Values to apply to where clauses in prepared statements
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $whereValues = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Value for limit string
|
2018-01-24 15:03:41 -05:00
|
|
|
* @var integer
|
2018-01-23 11:22:23 -05:00
|
|
|
*/
|
|
|
|
protected $limit;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Value for offset in limit string
|
|
|
|
* @var string|false
|
|
|
|
*/
|
|
|
|
protected $offset = FALSE;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Query component order mapping
|
|
|
|
* for complex select queries
|
|
|
|
*
|
|
|
|
* Format:
|
|
|
|
* array(
|
|
|
|
* 'type' => 'where',
|
|
|
|
* 'conjunction' => ' AND ',
|
|
|
|
* 'string' => 'k=?'
|
|
|
|
* )
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $queryMap = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Map for having clause
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $havingMap = [];
|
|
|
|
|
2018-01-24 15:03:41 -05:00
|
|
|
/**
|
|
|
|
* @param string $str
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-23 11:22:23 -05:00
|
|
|
public function setSelectString(string $str): self
|
2018-01-24 15:03:41 -05:00
|
|
|
{
|
|
|
|
$this->selectString = $str;
|
|
|
|
return $this;
|
|
|
|
}
|
2018-01-23 11:22:23 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
2018-01-24 15:03:41 -05:00
|
|
|
public function getSelectString(): string
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
return $this->selectString;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $str
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 15:03:41 -05:00
|
|
|
public function appendSelectString(string $str): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->selectString .= $str;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getFromString(): string
|
|
|
|
{
|
|
|
|
return $this->fromString;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $fromString
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setFromString(string $fromString): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->fromString = $fromString;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getSetString(): string
|
|
|
|
{
|
|
|
|
return $this->setString;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $setString
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setSetString(string $setString): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->setString = $setString;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getOrderString(): string
|
|
|
|
{
|
|
|
|
return $this->orderString;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $orderString
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setOrderString(string $orderString): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->orderString = $orderString;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getGroupString(): string
|
|
|
|
{
|
|
|
|
return $this->groupString;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $groupString
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setGroupString(string $groupString): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->groupString = $groupString;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getSetArrayKeys(): array
|
|
|
|
{
|
|
|
|
return $this->setArrayKeys;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param array $setArrayKeys
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function appendSetArrayKeys(array $setArrayKeys): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->setArrayKeys = array_merge($this->setArrayKeys, $setArrayKeys);
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param array $setArrayKeys
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setSetArrayKeys(array $setArrayKeys): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->setArrayKeys = $setArrayKeys;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getOrderArray(): array
|
|
|
|
{
|
|
|
|
return $this->orderArray;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $key
|
|
|
|
* @param mixed $orderArray
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setOrderArray(string $key, $orderArray): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->orderArray[$key] = $orderArray;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getGroupArray(): array
|
|
|
|
{
|
|
|
|
return $this->groupArray;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param array $groupArray
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setGroupArray(array $groupArray): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->groupArray = $groupArray;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $groupArray
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function appendGroupArray(string $groupArray): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->groupArray[] = $groupArray;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getValues(): array
|
|
|
|
{
|
|
|
|
return $this->values;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param array $values
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function appendValues(array $values): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->values = array_merge($this->values, $values);
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getWhereValues(): array
|
|
|
|
{
|
|
|
|
return $this->whereValues;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param mixed $val
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function appendWhereValues($val): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
if (\is_array($val))
|
|
|
|
{
|
|
|
|
foreach($val as $v)
|
|
|
|
{
|
|
|
|
$this->whereValues[] = $v;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->whereValues[] = $val;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
public function getLimit(): ?int
|
|
|
|
{
|
|
|
|
return $this->limit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param int $limit
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setLimit(int $limit): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->limit = $limit;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string|false
|
|
|
|
*/
|
|
|
|
public function getOffset()
|
|
|
|
{
|
|
|
|
return $this->offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string|false $offset
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function setOffset($offset): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->offset = $offset;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getQueryMap(): array
|
|
|
|
{
|
|
|
|
return $this->queryMap;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add an additional set of mapping pairs to a internal map
|
|
|
|
*
|
|
|
|
* @param string $conjunction
|
|
|
|
* @param string $string
|
|
|
|
* @param string $type
|
|
|
|
* @return State
|
|
|
|
*/
|
|
|
|
public function appendMap(string $conjunction = '', string $string = '', string $type = ''): self
|
|
|
|
{
|
|
|
|
$this->queryMap[] = [
|
|
|
|
'type' => $type,
|
|
|
|
'conjunction' => $conjunction,
|
|
|
|
'string' => $string
|
|
|
|
];
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getHavingMap(): array
|
|
|
|
{
|
|
|
|
return $this->havingMap;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param array $item
|
|
|
|
* @return State
|
|
|
|
*/
|
2018-01-24 13:14:03 -05:00
|
|
|
public function appendHavingMap(array $item): self
|
2018-01-23 11:22:23 -05:00
|
|
|
{
|
|
|
|
$this->havingMap[] = $item;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
}
|