Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[10.x] database expressions with grammar-specific formatting #44784

Merged
merged 5 commits into from
Feb 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/Illuminate/Contracts/Database/Query/Expression.php
Original file line number Diff line number Diff line change
@@ -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 string|int|float
*/
public function getValue(Grammar $grammar);
}
2 changes: 1 addition & 1 deletion src/Illuminate/Database/Concerns/BuildsQueries.php
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
18 changes: 11 additions & 7 deletions src/Illuminate/Database/Grammar.php
Original file line number Diff line number Diff line change
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,18 @@ 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 \Illuminate\Contracts\Database\Query\Expression|string|int|float $expression
* @return string|int|float
*/
public function getValue($expression)
{
return $expression->getValue();
if ($this->isExpression($expression)) {
return $this->getValue($expression->getValue($this));
}

return $expression;
}

/**
Expand Down