0 follower

Trait yii\db\QueryTrait

Implemented byyii\db\ActiveQuery, yii\db\Query
Available since version2.0
Source Code https://github.com/yiisoft/yii2/blob/master/framework/db/QueryTrait.php

The BaseQuery trait represents the minimum method set of a database Query.

It is supposed to be used in a class that implements the yii\db\QueryInterface.

Public Properties

Hide inherited properties

Property Type Description Defined By
$emulateExecution boolean Whether to emulate the actual query execution, returning empty or false results. yii\db\QueryTrait
$indexBy string|callable|null The name of the column by which the query results should be indexed by. yii\db\QueryTrait
$limit integer|yii\db\ExpressionInterface|null Maximum number of records to be returned. yii\db\QueryTrait
$offset integer|yii\db\ExpressionInterface|null Zero-based offset from where the records are to be returned. yii\db\QueryTrait
$orderBy array|null How to sort the query results. yii\db\QueryTrait
$where string|array|yii\db\ExpressionInterface|null Query condition. yii\db\QueryTrait

Public Methods

Hide inherited methods

Method Description Defined By
addOrderBy() Adds additional ORDER BY columns to the query. yii\db\QueryTrait
andFilterWhere() Adds an additional WHERE condition to the existing one but ignores empty operands. yii\db\QueryTrait
andWhere() Adds an additional WHERE condition to the existing one. yii\db\QueryTrait
emulateExecution() Sets whether to emulate query execution, preventing any interaction with data storage. yii\db\QueryTrait
filterWhere() Sets the WHERE part of the query but ignores empty operands. yii\db\QueryTrait
indexBy() Sets the indexBy() property. yii\db\QueryTrait
limit() Sets the LIMIT part of the query. yii\db\QueryTrait
offset() Sets the OFFSET part of the query. yii\db\QueryTrait
orFilterWhere() Adds an additional WHERE condition to the existing one but ignores empty operands. yii\db\QueryTrait
orWhere() Adds an additional WHERE condition to the existing one. yii\db\QueryTrait
orderBy() Sets the ORDER BY part of the query. yii\db\QueryTrait
where() Sets the WHERE part of the query. yii\db\QueryTrait

Protected Methods

Hide inherited methods

Method Description Defined By
filterCondition() Removes empty operands from the given query condition. yii\db\QueryTrait
isEmpty() Returns a value indicating whether the give value is "empty". yii\db\QueryTrait
normalizeOrderBy() Normalizes format of ORDER BY data. yii\db\QueryTrait

Property Details

Hide inherited properties

$emulateExecution public property (available since version 2.0.11)

Whether to emulate the actual query execution, returning empty or false results.

See also emulateExecution().

public boolean $emulateExecution false
$indexBy public property

The name of the column by which the query results should be indexed by. This can also be a callable (e.g. anonymous function) that returns the index value based on the given row data. For more details, see indexBy(). This property is only used by all().

public string|callable|null $indexBy null
$limit public property

Maximum number of records to be returned. May be an instance of yii\db\ExpressionInterface. If not set or less than 0, it means no limit.

$offset public property

Zero-based offset from where the records are to be returned. May be an instance of yii\db\ExpressionInterface. If not set or less than 0, it means starting from the beginning.

$orderBy public property

How to sort the query results. This is used to construct the ORDER BY clause in a SQL statement. The array keys are the columns to be sorted by, and the array values are the corresponding sort directions which can be either SORT_ASC or SORT_DESC. The array may also contain yii\db\ExpressionInterface objects. If that is the case, the expressions will be converted into strings without any change.

public array|null $orderBy null
$where public property

Query condition. This refers to the WHERE clause in a SQL statement. For example, ['age' => 31, 'team' => 1].

See also where() for valid syntax on specifying this value.

Method Details

Hide inherited methods

addOrderBy() public method

Adds additional ORDER BY columns to the query.

See also orderBy().

public $this addOrderBy ( $columns )
$columns string|array|yii\db\ExpressionInterface

The columns (and the directions) to be ordered by. Columns can be specified in either a string (e.g. "id ASC, name DESC") or an array (e.g. ['id' => SORT_ASC, 'name' => SORT_DESC]).

The method will automatically quote the column names unless a column contains some parenthesis (which means the column contains a DB expression).

Note that if your order-by is an expression containing commas, you should always use an array to represent the order-by information. Otherwise, the method will not be able to correctly determine the order-by columns.

Since version 2.0.7, an yii\db\ExpressionInterface object can be passed to specify the ORDER BY part explicitly in plain SQL.

return $this

The query object itself

                public function addOrderBy($columns)
{
    $columns = $this->normalizeOrderBy($columns);
    if ($this->orderBy === null) {
        $this->orderBy = $columns;
    } else {
        $this->orderBy = array_merge($this->orderBy, $columns);
    }
    return $this;
}

            
andFilterWhere() public method

Adds an additional WHERE condition to the existing one but ignores empty operands.

The new condition and the existing one will be joined using the 'AND' operator.

This method is similar to andWhere(). The main difference is that this method will remove empty query operands. As a result, this method is best suited for building query conditions based on filter values entered by users.

See also:

public $this andFilterWhere ( array $condition )
$condition array

The new WHERE condition. Please refer to where() on how to specify this parameter.

return $this

The query object itself

                public function andFilterWhere(array $condition)
{
    $condition = $this->filterCondition($condition);
    if ($condition !== []) {
        $this->andWhere($condition);
    }
    return $this;
}

            
andWhere() public method

Adds an additional WHERE condition to the existing one.

The new condition and the existing one will be joined using the 'AND' operator.

See also:

public $this andWhere ( $condition )
$condition string|array|yii\db\ExpressionInterface

The new WHERE condition. Please refer to where() on how to specify this parameter.

return $this

The query object itself

                public function andWhere($condition)
{
    if ($this->where === null) {
        $this->where = $condition;
    } else {
        $this->where = ['and', $this->where, $condition];
    }
    return $this;
}

            
emulateExecution() public method (available since version 2.0.11)

Sets whether to emulate query execution, preventing any interaction with data storage.

After this mode is enabled, methods, returning query results like yii\db\QueryInterface::one(), yii\db\QueryInterface::all(), yii\db\QueryInterface::exists() and so on, will return empty or false values. You should use this method in case your program logic indicates query should not return any results, like in case you set false where condition like 0=1.

public $this emulateExecution ( $value true )
$value boolean

Whether to prevent query execution.

return $this

The query object itself.

                public function emulateExecution($value = true)
{
    $this->emulateExecution = $value;
    return $this;
}

            
filterCondition() protected method

Removes empty operands from the given query condition.

protected array filterCondition ( $condition )
$condition array

The original condition

return array

The condition with empty operands removed.

throws yii\base\NotSupportedException

if the condition operator is not supported

                protected function filterCondition($condition)
{
    if (!is_array($condition)) {
        return $condition;
    }
    if (!isset($condition[0])) {
        // hash format: 'column1' => 'value1', 'column2' => 'value2', ...
        foreach ($condition as $name => $value) {
            if ($this->isEmpty($value)) {
                unset($condition[$name]);
            }
        }
        return $condition;
    }
    // operator format: operator, operand 1, operand 2, ...
    $operator = array_shift($condition);
    switch (strtoupper($operator)) {
        case 'NOT':
        case 'AND':
        case 'OR':
            foreach ($condition as $i => $operand) {
                $subCondition = $this->filterCondition($operand);
                if ($this->isEmpty($subCondition)) {
                    unset($condition[$i]);
                } else {
                    $condition[$i] = $subCondition;
                }
            }
            if (empty($condition)) {
                return [];
            }
            break;
        case 'BETWEEN':
        case 'NOT BETWEEN':
            if (array_key_exists(1, $condition) && array_key_exists(2, $condition)) {
                if ($this->isEmpty($condition[1]) || $this->isEmpty($condition[2])) {
                    return [];
                }
            }
            break;
        default:
            if (array_key_exists(1, $condition) && $this->isEmpty($condition[1])) {
                return [];
            }
    }
    array_unshift($condition, $operator);
    return $condition;
}

            
filterWhere() public method

Sets the WHERE part of the query but ignores empty operands.

This method is similar to where(). The main difference is that this method will remove empty query operands. As a result, this method is best suited for building query conditions based on filter values entered by users.

The following code shows the difference between this method and where():

// WHERE `age`=:age
$query->filterWhere(['name' => null, 'age' => 20]);
// WHERE `age`=:age
$query->where(['age' => 20]);
// WHERE `name` IS NULL AND `age`=:age
$query->where(['name' => null, 'age' => 20]);

Note that unlike where(), you cannot pass binding parameters to this method.

See also:

public $this filterWhere ( array $condition )
$condition array

The conditions that should be put in the WHERE part. See where() on how to specify this parameter.

return $this

The query object itself

                public function filterWhere(array $condition)
{
    $condition = $this->filterCondition($condition);
    if ($condition !== []) {
        $this->where($condition);
    }
    return $this;
}

            
indexBy() public method

Sets the indexBy() property.

public $this indexBy ( $column )
$column string|callable

The name of the column by which the query results should be indexed by. This can also be a callable (e.g. anonymous function) that returns the index value based on the given row data. The signature of the callable should be:

function ($row)
{
    // return the index value corresponding to $row
}
return $this

The query object itself

                public function indexBy($column)
{
    $this->indexBy = $column;
    return $this;
}

            
isEmpty() protected method

Returns a value indicating whether the give value is "empty".

The value is considered "empty", if one of the following conditions is satisfied:

  • it is null,
  • an empty string (''),
  • a string containing only whitespace characters,
  • or an empty array.
protected boolean isEmpty ( $value )
$value mixed
return boolean

If the value is empty

                protected function isEmpty($value)
{
    return $value === '' || $value === [] || $value === null || is_string($value) && trim($value) === '';
}

            
limit() public method

Sets the LIMIT part of the query.

public $this limit ( $limit )
$limit integer|yii\db\ExpressionInterface|null

The limit. Use null or negative value to disable limit.

return $this

The query object itself

                public function limit($limit)
{
    $this->limit = $limit;
    return $this;
}

            
normalizeOrderBy() protected method

Normalizes format of ORDER BY data.

protected array normalizeOrderBy ( $columns )
$columns array|string|yii\db\ExpressionInterface|null

The columns value to normalize. See orderBy() and addOrderBy().

                protected function normalizeOrderBy($columns)
{
    if (empty($columns)) {
        return [];
    } elseif ($columns instanceof ExpressionInterface) {
        return [$columns];
    } elseif (is_array($columns)) {
        return $columns;
    }
    $columns = preg_split('/\s*,\s*/', trim($columns), -1, PREG_SPLIT_NO_EMPTY);
    $result = [];
    foreach ($columns as $column) {
        if (preg_match('/^(.*?)\s+(asc|desc)$/i', $column, $matches)) {
            $result[$matches[1]] = strcasecmp($matches[2], 'desc') ? SORT_ASC : SORT_DESC;
        } else {
            $result[$column] = SORT_ASC;
        }
    }
    return $result;
}

            
offset() public method

Sets the OFFSET part of the query.

public $this offset ( $offset )
$offset integer|yii\db\ExpressionInterface|null

The offset. Use null or negative value to disable offset.

return $this

The query object itself

                public function offset($offset)
{
    $this->offset = $offset;
    return $this;
}

            
orFilterWhere() public method

Adds an additional WHERE condition to the existing one but ignores empty operands.

The new condition and the existing one will be joined using the 'OR' operator.

This method is similar to orWhere(). The main difference is that this method will remove empty query operands. As a result, this method is best suited for building query conditions based on filter values entered by users.

See also:

public $this orFilterWhere ( array $condition )
$condition array

The new WHERE condition. Please refer to where() on how to specify this parameter.

return $this

The query object itself

                public function orFilterWhere(array $condition)
{
    $condition = $this->filterCondition($condition);
    if ($condition !== []) {
        $this->orWhere($condition);
    }
    return $this;
}

            
orWhere() public method

Adds an additional WHERE condition to the existing one.

The new condition and the existing one will be joined using the 'OR' operator.

See also:

public $this orWhere ( $condition )
$condition string|array|yii\db\ExpressionInterface

The new WHERE condition. Please refer to where() on how to specify this parameter.

return $this

The query object itself

                public function orWhere($condition)
{
    if ($this->where === null) {
        $this->where = $condition;
    } else {
        $this->where = ['or', $this->where, $condition];
    }
    return $this;
}

            
orderBy() public method

Sets the ORDER BY part of the query.

See also addOrderBy().

public $this orderBy ( $columns )
$columns string|array|yii\db\ExpressionInterface|null

The columns (and the directions) to be ordered by. Columns can be specified in either a string (e.g. "id ASC, name DESC") or an array (e.g. ['id' => SORT_ASC, 'name' => SORT_DESC]).

The method will automatically quote the column names unless a column contains some parenthesis (which means the column contains a DB expression).

Note that if your order-by is an expression containing commas, you should always use an array to represent the order-by information. Otherwise, the method will not be able to correctly determine the order-by columns.

Since version 2.0.7, an yii\db\ExpressionInterface object can be passed to specify the ORDER BY part explicitly in plain SQL.

return $this

The query object itself

                public function orderBy($columns)
{
    $this->orderBy = $this->normalizeOrderBy($columns);
    return $this;
}

            
where() public method

Sets the WHERE part of the query.

See yii\db\QueryInterface::where() for detailed documentation.

See also:

public $this where ( $condition )
$condition string|array|yii\db\ExpressionInterface

The conditions that should be put in the WHERE part.

return $this

The query object itself

                public function where($condition)
{
    $this->where = $condition;
    return $this;
}