Skip to content

Commit

Permalink
[10.x] database expressions with grammar-specific formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
tpetry committed Jan 23, 2023
1 parent c0240d2 commit c09a9fc
Show file tree
Hide file tree
Showing 20 changed files with 105 additions and 74 deletions.
16 changes: 16 additions & 0 deletions src/Illuminate/Contracts/Database/Query/Expression.php
@@ -0,0 +1,16 @@
<?php

namespace Illuminate\Contracts\Database\Query;

use Illuminate\Database\Grammar;

interface Expression
{
/**
* Get the value of the expression.
*
* @param \Illuminate\Database\Grammar $grammar
* @return scalar
*/
public function getValue(Grammar $grammar);
}
2 changes: 1 addition & 1 deletion src/Illuminate/Database/Concerns/BuildsQueries.php
Expand Up @@ -423,7 +423,7 @@ protected function paginateUsingCursor($perPage, $columns = ['*'], $cursorName =
*/
protected function getOriginalColumnNameForCursorPagination($builder, string $parameter)
{
$columns = $builder instanceof Builder ? $builder->getQuery()->columns : $builder->columns;
$columns = $builder instanceof Builder ? $builder->getQuery()->getColumns() : $builder->getColumns();

if (! is_null($columns)) {
foreach ($columns as $column) {
Expand Down
2 changes: 1 addition & 1 deletion src/Illuminate/Database/Connection.php
Expand Up @@ -1000,7 +1000,7 @@ protected function event($event)
* Get a new raw query expression.
*
* @param mixed $value
* @return \Illuminate\Database\Query\Expression
* @return \Illuminate\Contracts\Database\Query\Expression
*/
public function raw($value)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Illuminate/Database/ConnectionInterface.php
Expand Up @@ -19,7 +19,7 @@ public function table($table, $as = null);
* Get a new raw query expression.
*
* @param mixed $value
* @return \Illuminate\Database\Query\Expression
* @return \Illuminate\Contracts\Database\Query\Expression
*/
public function raw($value);

Expand Down
30 changes: 15 additions & 15 deletions src/Illuminate/Database/Eloquent/Builder.php
Expand Up @@ -280,7 +280,7 @@ public function whereKeyNot($id)
/**
* Add a basic where clause to the query.
*
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @param string $boolean
Expand All @@ -302,7 +302,7 @@ public function where($column, $operator = null, $value = null, $boolean = 'and'
/**
* Add a basic where clause to the query, and return the first result.
*
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @param string $boolean
Expand All @@ -316,7 +316,7 @@ public function firstWhere($column, $operator = null, $value = null, $boolean =
/**
* Add an "or where" clause to the query.
*
* @param \Closure|array|string|\Illuminate\Database\Query\Expression $column
* @param \Closure|array|string|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return $this
Expand All @@ -333,7 +333,7 @@ public function orWhere($column, $operator = null, $value = null)
/**
* Add a basic "where not" clause to the query.
*
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @param string $boolean
Expand All @@ -347,7 +347,7 @@ public function whereNot($column, $operator = null, $value = null, $boolean = 'a
/**
* Add an "or where not" clause to the query.
*
* @param \Closure|array|string|\Illuminate\Database\Query\Expression $column
* @param \Closure|array|string|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return $this
Expand All @@ -360,7 +360,7 @@ public function orWhereNot($column, $operator = null, $value = null)
/**
* Add an "order by" clause for a timestamp to the query.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @return $this
*/
public function latest($column = null)
Expand All @@ -377,7 +377,7 @@ public function latest($column = null)
/**
* Add an "order by" clause for a timestamp to the query.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @return $this
*/
public function oldest($column = null)
Expand Down Expand Up @@ -641,7 +641,7 @@ public function sole($columns = ['*'])
/**
* Get a single column's value from the first result of a query.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @return mixed
*/
public function value($column)
Expand All @@ -654,7 +654,7 @@ public function value($column)
/**
* Get a single column's value from the first result of a query if it's the sole matching record.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @return mixed
*
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
Expand All @@ -668,7 +668,7 @@ public function soleValue($column)
/**
* Get a single column's value from the first result of the query or throw an exception.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @return mixed
*
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
Expand Down Expand Up @@ -851,7 +851,7 @@ protected function enforceOrderBy()
/**
* Get an array with the values of a given column.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @param string|null $key
* @return \Illuminate\Support\Collection
*/
Expand Down Expand Up @@ -1066,7 +1066,7 @@ public function touch($column = null)
/**
* Increment a column's value by a given amount.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @param float|int $amount
* @param array $extra
* @return int
Expand All @@ -1081,7 +1081,7 @@ public function increment($column, $amount = 1, array $extra = [])
/**
* Decrement a column's value by a given amount.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @param float|int $amount
* @param array $extra
* @return int
Expand Down Expand Up @@ -1746,7 +1746,7 @@ public function setModel(Model $model)
/**
* Qualify the given column name by the model's table.
*
* @param string|\Illuminate\Database\Query\Expression $column
* @param string|\Illuminate\Contracts\Database\Query\Expression $column
* @return string
*/
public function qualifyColumn($column)
Expand All @@ -1757,7 +1757,7 @@ public function qualifyColumn($column)
/**
* Qualify the given columns with the model's table.
*
* @param array|\Illuminate\Database\Query\Expression $columns
* @param array|\Illuminate\Contracts\Database\Query\Expression $columns
* @return array
*/
public function qualifyColumns($columns)
Expand Down
Expand Up @@ -374,7 +374,7 @@ public function orWhereDoesntHaveMorph($relation, $types, Closure $callback = nu
* Add a basic where clause to a relationship query.
*
* @param string $relation
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
Expand All @@ -394,7 +394,7 @@ public function whereRelation($relation, $column, $operator = null, $value = nul
* Add an "or where" clause to a relationship query.
*
* @param string $relation
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
Expand All @@ -415,7 +415,7 @@ public function orWhereRelation($relation, $column, $operator = null, $value = n
*
* @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation
* @param string|array $types
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
Expand All @@ -432,7 +432,7 @@ public function whereMorphRelation($relation, $types, $column, $operator = null,
*
* @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation
* @param string|array $types
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
Expand Down
19 changes: 12 additions & 7 deletions src/Illuminate/Database/Grammar.php
Expand Up @@ -2,7 +2,7 @@

namespace Illuminate\Database;

use Illuminate\Database\Query\Expression;
use Illuminate\Contracts\Database\Query\Expression;
use Illuminate\Support\Traits\Macroable;
use RuntimeException;

Expand Down Expand Up @@ -31,7 +31,7 @@ public function wrapArray(array $values)
/**
* Wrap a table in keyword identifiers.
*
* @param \Illuminate\Database\Query\Expression|string $table
* @param \Illuminate\Contracts\Database\Query\Expression|string $table
* @return string
*/
public function wrapTable($table)
Expand All @@ -46,7 +46,7 @@ public function wrapTable($table)
/**
* Wrap a value in keyword identifiers.
*
* @param \Illuminate\Database\Query\Expression|string $value
* @param \Illuminate\Contracts\Database\Query\Expression|string $value
* @param bool $prefixAlias
* @return string
*/
Expand Down Expand Up @@ -208,14 +208,19 @@ public function isExpression($value)
}

/**
* Get the value of a raw expression.
* Transforms expressions to their scalar types.
*
* @param \Illuminate\Database\Query\Expression $expression
* @return mixed
* @param scalar|\Illuminate\Contracts\Database\Query\Expression $expression
* @return scalar
*/
public function getValue($expression)
{
return $expression->getValue();
$value = $expression;
if ($this->isExpression($value)) {
$value = $this->getValue($value->getValue($this));
}

return $value;
}

/**
Expand Down

0 comments on commit c09a9fc

Please sign in to comment.