Implementd query aliases

This commit is contained in:
Dennis Eichhorn 2019-10-13 20:38:25 +02:00
parent b0f452952f
commit 479facee52
9 changed files with 119 additions and 37 deletions

View File

@ -676,7 +676,7 @@ class DataMapperAbstract implements DataMapperInterface
$objsIds = []; $objsIds = [];
$relReflectionClass = null; $relReflectionClass = null;
foreach ($values as $key => &$value) { foreach ($values as $key => $value) {
if (!\is_object($value)) { if (!\is_object($value)) {
// Is scalar => already in database // Is scalar => already in database
$objsIds[$key] = $value; $objsIds[$key] = $value;

View File

@ -82,6 +82,8 @@ abstract class GrammarAbstract
*/ */
protected array $specialKeywords = [ protected array $specialKeywords = [
'COUNT(', 'COUNT(',
'MAX(',
'MIN(',
]; ];
/** /**
@ -207,13 +209,13 @@ abstract class GrammarAbstract
foreach ($elements as $key => $element) { foreach ($elements as $key => $element) {
if (\is_string($element) && $element !== '*') { if (\is_string($element) && $element !== '*') {
$prefix = \stripos($element, '.') !== false || $column ? $prefix : ''; $prefix = \stripos($element, '.') !== false || $column ? $prefix : '';
$expression .= $this->compileSystem($element, $prefix) . ', '; $expression .= $this->compileSystem($element, $prefix) . (\is_string($key) ? ' as ' . $prefix . $key : '') . ', ';
} elseif (\is_string($element) && $element === '*') { } elseif (\is_string($element) && $element === '*') {
$expression .= '*, '; $expression .= '*, ';
} elseif ($element instanceof \Closure) { } elseif ($element instanceof \Closure) {
$expression .= $element() . ', '; $expression .= $element() . (\is_string($key) ? ' as ' . $prefix . $key : '') . ', ';
} elseif ($element instanceof BuilderAbstract) { } elseif ($element instanceof BuilderAbstract) {
$expression .= $element->toSql() . ', '; $expression .= $element->toSql() . (\is_string($key) ? ' as ' . $prefix . $key : '') . ', ';
} else { } else {
throw new \InvalidArgumentException(); throw new \InvalidArgumentException();
} }

View File

@ -278,6 +278,24 @@ class Builder extends BuilderAbstract
return $this; return $this;
} }
/**
* Select with alias.
*
* @param mixed $column Column query
* @param string $alias Alias
*
* @return Builder
*
* @since 1.0.0
*/
public function selectAs($column, string $alias) : self
{
$this->type = QueryType::SELECT;
$this->selects[$alias] = $column;
return $this;
}
/** /**
* Select. * Select.
* *
@ -448,6 +466,23 @@ class Builder extends BuilderAbstract
return $this; return $this;
} }
/**
* From with alias.
*
* @param mixed $column Column query
* @param string $alias Alias
*
* @return Builder
*
* @since 1.0.0
*/
public function fromAs($column, string $alias) : self
{
$this->from[$alias] = $column;
return $this;
}
/** /**
* Make raw from. * Make raw from.
* *
@ -1050,16 +1085,24 @@ class Builder extends BuilderAbstract
/** /**
* Join. * Join.
* *
* @param mixed $table Join query
* @param string $type Join type
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function join($table, string $type = JoinType::JOIN) : self public function join($table, string $type = JoinType::JOIN, string $alias = null) : self
{ {
if (\is_string($table) || $table instanceof \Closure) { if (!\is_string($table)&& !($table instanceof self) && !($table instanceof \Closure)) {
throw new \InvalidArgumentException();
}
if ($alias === null) {
$this->joins[] = ['type' => $type, 'table' => $table]; $this->joins[] = ['type' => $type, 'table' => $table];
} else { } else {
throw new \InvalidArgumentException(); $this->joins[$alias] = ['type' => $type, 'table' => $table];
} }
return $this; return $this;
@ -1068,133 +1111,166 @@ class Builder extends BuilderAbstract
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function leftJoin($column) : self public function leftJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::LEFT_JOIN); return $this->join($column, JoinType::LEFT_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function leftOuterJoin($column) : self public function leftOuterJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::LEFT_OUTER_JOIN); return $this->join($column, JoinType::LEFT_OUTER_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function leftInnerJoin($column) : self public function leftInnerJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::LEFT_INNER_JOIN); return $this->join($column, JoinType::LEFT_INNER_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function rightJoin($column) : self public function rightJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::RIGHT_JOIN); return $this->join($column, JoinType::RIGHT_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function rightOuterJoin($column) : self public function rightOuterJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::RIGHT_OUTER_JOIN); return $this->join($column, JoinType::RIGHT_OUTER_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function rightInnerJoin($column) : self public function rightInnerJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::RIGHT_INNER_JOIN); return $this->join($column, JoinType::RIGHT_INNER_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function outerJoin($column) : self public function outerJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::OUTER_JOIN); return $this->join($column, JoinType::OUTER_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function innerJoin($column) : self public function innerJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::INNER_JOIN); return $this->join($column, JoinType::INNER_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function crossJoin($column) : self public function crossJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::CROSS_JOIN); return $this->join($column, JoinType::CROSS_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function fullJoin($column) : self public function fullJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::FULL_JOIN); return $this->join($column, JoinType::FULL_JOIN, $alias);
} }
/** /**
* Join. * Join.
* *
* @param mixed $column Join query
* @param null|string $alias Alias name (empty = none)
*
* @return Builder * @return Builder
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function fullOuterJoin($column) : self public function fullOuterJoin($column, string $alias = null) : self
{ {
return $this->join($column, JoinType::FULL_OUTER_JOIN); return $this->join($column, JoinType::FULL_OUTER_JOIN, $alias);
} }
/** /**
@ -1237,7 +1313,8 @@ class Builder extends BuilderAbstract
throw new \InvalidArgumentException('Unknown operator.'); throw new \InvalidArgumentException('Unknown operator.');
} }
$this->ons[$joinCount][] = [ // @todo: this is bad! ons needs to have the same key as the join for the grammar to work. since alias are possible this is nec3essary.
$this->ons[\array_keys($this->joins)[$joinCount]][] = [
'column' => $column, 'column' => $column,
'operator' => $operator[$i], 'operator' => $operator[$i],
'value' => $values[$i], 'value' => $values[$i],

View File

@ -252,7 +252,7 @@ class Grammar extends GrammarAbstract
} elseif ($element['column'] instanceof \Closure) { } elseif ($element['column'] instanceof \Closure) {
$expression .= $element['column'](); $expression .= $element['column']();
} elseif ($element['column'] instanceof Builder) { } elseif ($element['column'] instanceof Builder) {
$expression .= '(' . $element['column']->toSql() . ')'; $expression .= '(' . \rtrim($element['column']->toSql(), ';') . ')';
} elseif ($element['column'] instanceof Where) { } elseif ($element['column'] instanceof Where) {
$expression .= '(' . \rtrim($this->compileWhereQuery($element['column']), ';') . ')'; $expression .= '(' . \rtrim($this->compileWhereQuery($element['column']), ';') . ')';
} }
@ -409,7 +409,15 @@ class Grammar extends GrammarAbstract
foreach ($joins as $key => $join) { foreach ($joins as $key => $join) {
$expression .= $join['type'] . ' '; $expression .= $join['type'] . ' ';
$expression .= $this->compileSystem($join['table'], $query->getPrefix());
if (\is_string($join['table'])) {
$expression .= $this->compileSystem($join['table'], $query->getPrefix()) . (\is_string($key) ? ' as ' . $query->getPrefix() . $key : '');
} elseif ($join['table'] instanceof \Closure) {
$expression .= $join['table']() . (\is_string($key) ? ' as ' . $query->getPrefix() . $key : '');
} elseif ($join['table'] instanceof Builder) {
$expression .= '(' . \rtrim($join['table']->toSql(), ';') . ')' . (\is_string($key) ? ' as ' . $query->getPrefix() . $key : '');
}
$expression .= $this->compileOn($query, $query->ons[$key]); $expression .= $this->compileOn($query, $query->ons[$key]);
} }

View File

@ -12,7 +12,6 @@
*/ */
declare(strict_types=1); declare(strict_types=1);
namespace phpOMS\tests\phpOMS\Model\Message; namespace phpOMS\tests\phpOMS\Model\Message;
use phpOMS\Model\Message\Dom; use phpOMS\Model\Message\Dom;

View File

@ -12,7 +12,6 @@
*/ */
declare(strict_types=1); declare(strict_types=1);
namespace phpOMS\tests\phpOMS\Model\Message; namespace phpOMS\tests\phpOMS\Model\Message;
use phpOMS\Model\Message\FormValidation; use phpOMS\Model\Message\FormValidation;

View File

@ -12,7 +12,6 @@
*/ */
declare(strict_types=1); declare(strict_types=1);
namespace phpOMS\tests\phpOMS\Model\Message; namespace phpOMS\tests\phpOMS\Model\Message;
use phpOMS\Model\Message\Notify; use phpOMS\Model\Message\Notify;

View File

@ -12,7 +12,6 @@
*/ */
declare(strict_types=1); declare(strict_types=1);
namespace phpOMS\tests\phpOMS\Model\Message; namespace phpOMS\tests\phpOMS\Model\Message;
use phpOMS\Model\Message\Redirect; use phpOMS\Model\Message\Redirect;

View File

@ -12,7 +12,6 @@
*/ */
declare(strict_types=1); declare(strict_types=1);
namespace phpOMS\tests\phpOMS\Model\Message; namespace phpOMS\tests\phpOMS\Model\Message;
use phpOMS\Model\Message\Reload; use phpOMS\Model\Message\Reload;