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

View File

@ -21,6 +21,7 @@ use phpOMS\DataStorage\Database\GrammarAbstract;
use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\DataStorage\Database\Query\Builder;
use phpOMS\DataStorage\Database\Query\Column; use phpOMS\DataStorage\Database\Query\Column;
use phpOMS\DataStorage\Database\Query\QueryType; use phpOMS\DataStorage\Database\Query\QueryType;
use phpOMS\DataStorage\Database\Query\Where;
/** /**
* Database query grammar. * Database query grammar.
@ -122,6 +123,9 @@ class Grammar extends GrammarAbstract
case QueryType::RANDOM: case QueryType::RANDOM:
$components = $this->selectComponents; $components = $this->selectComponents;
break; break;
case QueryType::RAW:
return $query->raw;
break;
default: default:
throw new \InvalidArgumentException('Unknown query type.'); throw new \InvalidArgumentException('Unknown query type.');
} }
@ -198,28 +202,7 @@ class Grammar extends GrammarAbstract
foreach ($wheres as $key => $where) { foreach ($wheres as $key => $where) {
foreach ($where as $key2 => $element) { foreach ($where as $key2 => $element) {
if (!$first) { $expression .= $this->compileWhereElement($element, $query, $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
}
$first = false; $first = false;
} }
} }
@ -231,6 +214,37 @@ class Grammar extends GrammarAbstract
return 'WHERE ' . $expression; 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. * Compile value.
* *
@ -247,6 +261,10 @@ class Grammar extends GrammarAbstract
protected function compileValue($value, $prefix = '') : string protected function compileValue($value, $prefix = '') : string
{ {
if (is_string($value)) { if (is_string($value)) {
if(strpos($value, ':') === 0) {
return $value;
}
return $this->valueQuotes . $value . $this->valueQuotes; return $this->valueQuotes . $value . $this->valueQuotes;
} elseif (is_int($value)) { } elseif (is_int($value)) {
return $value; return $value;

View File

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