value, werhe and raw to builder

This commit is contained in:
Dennis Eichhorn 2016-09-11 19:59:51 +02:00
parent 0d686243be
commit dbb7ac5b02
3 changed files with 84 additions and 43 deletions

View File

@ -159,6 +159,8 @@ class Builder extends BuilderAbstract
protected $unionOrders = [];
public $raw = '';
/**
* Comparison operators.
*
@ -204,6 +206,11 @@ class Builder extends BuilderAbstract
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function __construct(ConnectionAbstract $connection)
{
$this->setConnection($connection);
}
public function setConnection(ConnectionAbstract $connection)
{
$this->connection = $connection;
$this->grammar = $connection->getGrammar();
@ -308,6 +315,14 @@ class Builder extends BuilderAbstract
return $this->grammar->compileQuery($this);
}
public function raw(string $raw) : Builder
{
$this->type = QueryType::RAW;
$this->raw = $raw;
return $this;
}
/**
* Make raw column selection.
*
@ -333,7 +348,7 @@ class Builder extends BuilderAbstract
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function distinct() : Builder
public function distinct(...$columns) : Builder
{
$this->distinct = true;
@ -380,23 +395,6 @@ class Builder extends BuilderAbstract
return $this;
}
/**
* Or Where.
*
* @param string|array|\Closure $columns Columns
* @param string $operator Operator
* @param string|array|\Closure $values Values
*
* @return Builder
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function orWhere($columns, string $operator = null, $values = null) : Builder
{
return $this->where($columns, $operator, $values, 'or');
}
/**
* Where.
*
@ -426,9 +424,13 @@ class Builder extends BuilderAbstract
throw new \InvalidArgumentException('Unknown operator.');
}
$this->wheres[$key][] = ['column' => $column, 'operator' => $operator[$i],
'value' => $values[$i],
'boolean' => $boolean[$i],];
$this->wheres[$key][] = [
'column' => $column,
'operator' => $operator[$i],
'value' => $values[$i],
'boolean' => $boolean[$i],
];
$i++;
}
} elseif (is_string($columns)) {
@ -445,6 +447,26 @@ class Builder extends BuilderAbstract
return $this;
}
public function andWhere(Where $where)
{
$this->wheres[][] = [
'column' => $where,
'boolean' => 'and',
];
return $this;
}
public function orWhere(Where $where)
{
$this->wheres[][] = [
'column' => $where,
'boolean' => 'or',
];
return $this;
}
/**
* Where in.
*

View File

@ -21,6 +21,7 @@ use phpOMS\DataStorage\Database\GrammarAbstract;
use phpOMS\DataStorage\Database\Query\Builder;
use phpOMS\DataStorage\Database\Query\Column;
use phpOMS\DataStorage\Database\Query\QueryType;
use phpOMS\DataStorage\Database\Query\Where;
/**
* Database query grammar.
@ -122,6 +123,9 @@ class Grammar extends GrammarAbstract
case QueryType::RANDOM:
$components = $this->selectComponents;
break;
case QueryType::RAW:
return $query->raw;
break;
default:
throw new \InvalidArgumentException('Unknown query type.');
}
@ -198,28 +202,7 @@ class Grammar extends GrammarAbstract
foreach ($wheres as $key => $where) {
foreach ($where as $key2 => $element) {
if (!$first) {
$expression .= ' ' . strtoupper($element['boolean']) . ' ';
}
if (is_string($element['column'])) {
$expression .= $this->compileSystem($element['column'], $query->getPrefix()) . ' ' . strtoupper($element['operator']) . ' ' . $this->compileValue($element['value'], $query->getPrefix());
} elseif ($element['column'] instanceof \Closure) {
} elseif ($element['column'] instanceof Builder) {
}
if (is_string($element['value'])) {
} elseif ($element['value'] instanceof \Closure) {
} elseif ($element['value'] instanceof Builder) {
} elseif ($element['value'] instanceof \DateTime) {
} elseif (is_int($element['value'])) {
} elseif (is_bool($element['value'])) {
} elseif (is_null($element['value'])) {
} elseif (is_float($element['value'])) {
} elseif (is_array($element['value'])) {
// is bind
}
$expression .= $this->compileWhereElement($element, $query, $first);
$first = false;
}
}
@ -231,6 +214,37 @@ class Grammar extends GrammarAbstract
return 'WHERE ' . $expression;
}
protected function compileWhereElement(array $element, Builder $query, bool $first = true) : string
{
$expression = '';
if(!$first) {
$expression = ' ' . strtoupper($element['boolean']) . ' ';
}
if (is_string($element['column'])) {
$expression .= $this->compileSystem($element['column'], $query->getPrefix());
} elseif ($element['column'] instanceof \Closure) {
$expression .= $element['column']();
} elseif ($element['column'] instanceof Builder) {
$expression .= '(' . $element['column']->toSql() . ')';
} elseif ($element['column'] instanceof Where) {
$expression .= '(' . $this->compileWhere($element['column'], $query->getPrefix()) . ')';
}
if (isset($element['value'])) {
$expression .= ' ' . strtoupper($element['operator']) . ' ' . $this->compileValue($element['value'], $query->getPrefix());
}
return $expression;
}
protected function compileWhere(Where $where, string $prefix = '', bool $first = true) : string
{
return '';
}
/**
* Compile value.
*
@ -247,6 +261,10 @@ class Grammar extends GrammarAbstract
protected function compileValue($value, $prefix = '') : string
{
if (is_string($value)) {
if(strpos($value, ':') === 0) {
return $value;
}
return $this->valueQuotes . $value . $this->valueQuotes;
} elseif (is_int($value)) {
return $value;

View File

@ -35,4 +35,5 @@ abstract class QueryType extends Enum
const UPDATE = 2;
const DELETE = 3;
const RANDOM = 4;
const RAW = 5;
}