mirror of
https://github.com/Karaka-Management/phpOMS.git
synced 2026-03-07 16:38:40 +00:00
Implementd query aliases
This commit is contained in:
parent
b0f452952f
commit
479facee52
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user