0

Class yii\db\sqlite\conditions\InConditionBuilder

Inheritanceyii\db\sqlite\conditions\InConditionBuilder » yii\db\conditions\InConditionBuilder
Implementsyii\db\ExpressionBuilderInterface
Uses Traitsyii\db\ExpressionBuilderTrait
Available since version2.0.14
Source Code https://github.com/yiisoft/yii2/blob/master/framework/db/sqlite/conditions/InConditionBuilder.php

Protected Properties

Hide inherited properties

Property Type Description Defined By
$queryBuilder yii\db\QueryBuilder yii\db\ExpressionBuilderTrait

Public Methods

Hide inherited methods

Method Description Defined By
__construct() ExpressionBuilderTrait constructor. yii\db\ExpressionBuilderTrait
build() Builds raw SQL from the expression. yii\db\conditions\InConditionBuilder

Protected Methods

Hide inherited methods

Method Description Defined By
buildCompositeInCondition() Builds SQL for composite IN condition. yii\db\conditions\InConditionBuilder
buildSubqueryInCondition() Builds SQL for IN condition. yii\db\sqlite\conditions\InConditionBuilder
buildValues() Builds values to be used in yii\db\conditions\InCondition. yii\db\conditions\InConditionBuilder
getNotEqualOperator() Returns inequality operator for decomposed NOT IN conditions. yii\db\sqlite\conditions\InConditionBuilder
getNullCondition() Builds IS NULL / IS NOT NULL condition for a scalar column based on the operator. yii\db\conditions\InConditionBuilder

Method Details

Hide inherited methods

__construct() public method

Defined in: yii\db\ExpressionBuilderTrait::__construct()

ExpressionBuilderTrait constructor.

public mixed __construct ( yii\db\QueryBuilder $queryBuilder )
$queryBuilder yii\db\QueryBuilder

                public function __construct(QueryBuilder $queryBuilder)
{
    $this->queryBuilder = $queryBuilder;
}

            
build() public method

Defined in: yii\db\conditions\InConditionBuilder::build()

Builds raw SQL from the expression.

public string build ( yii\db\ExpressionInterface|yii\db\conditions\InCondition $expression, array &$params = [] )
$expression yii\db\ExpressionInterface|yii\db\conditions\InCondition

The expression to be built.

$params array

The binding parameters.

return string

The raw SQL that will not be additionally escaped or quoted.

                public function build(ExpressionInterface $expression, array &$params = []): string
{
    $operator = strtoupper($expression->getOperator());
    $column = $expression->getColumn();
    $values = $expression->getValues();
    if ($column === []) {
        // no columns to test against
        return $operator === 'IN' ? '0=1' : '';
    }
    if ($values instanceof Query) {
        return $this->buildSubqueryInCondition($operator, $column, $values, $params);
    }
    if (!is_array($values)) {
        // ensure values is an array
        $values = [$values];
    }
    if (is_array($column)) {
        if (count($column) > 1) {
            return $this->buildCompositeInCondition($operator, $column, $values, $params);
        }
        $column = reset($column);
    }
    $nullCondition = null;
    $nullConditionOperator = null;
    if ($this->hasNullValue($column, $values)) {
        $nullCondition = $this->buildNullCondition($operator, $column, $params);
        $nullConditionOperator = $operator === 'IN' ? 'OR' : 'AND';
    }
    $sqlValues = $this->buildValues($expression, $values, $params);
    if ($sqlValues === []) {
        if ($nullCondition === null) {
            return $operator === 'IN' ? '0=1' : '';
        }
        return $nullCondition;
    }
    $column = $this->normalizeColumn($column, $params);
    if (count($sqlValues) > 1) {
        $sql = "$column $operator (" . implode(', ', $sqlValues) . ')';
    } else {
        $operator = $operator === 'IN' ? '=' : '<>';
        $sql = "{$column}{$operator}" . reset($sqlValues);
    }
    return $nullCondition !== null && $nullConditionOperator !== null
        ? "{$sql} {$nullConditionOperator} {$nullCondition}"
        : $sql;
}

            
buildCompositeInCondition() protected method

Defined in: yii\db\conditions\InConditionBuilder::buildCompositeInCondition()

Builds SQL for composite IN condition.

protected string buildCompositeInCondition ( string $operator, array $columns, array $values, array &$params )
$operator string

Operator in uppercase.

$columns array

Columns to be matched.

$values array

Row values.

$params array

The binding parameters.

return string

SQL for composite IN condition.

                protected function buildCompositeInCondition(
    string $operator,
    array $columns,
    array $values,
    array &$params
): string {
    $quotedColumns = [];
    $columnKeys = [];
    foreach ($columns as $i => $column) {
        $quotedColumns[$i] = $this->normalizeColumn($column, $params);
        $columnKeys[$i] = $this->resolveColumnKey($column);
    }
    $vss = [];
    $notEqualOperator = $this->getNotEqualOperator();
    foreach ($values as $value) {
        $vs = [];
        foreach ($columns as $i => $_) {
            $columnKey = $columnKeys[$i];
            $columnValue = null;
            if (
                (is_array($value) || $value instanceof ArrayAccess)
                && $columnKey !== null
            ) {
                $columnValue = $value[$columnKey] ?? null;
            }
            if ($columnValue === null) {
                $vs[] = $quotedColumns[$i] . ($operator === 'IN' ? ' IS' : ' IS NOT') . ' NULL';
            } else {
                if ($columnValue instanceof ExpressionInterface) {
                    $placeholder = $this->queryBuilder->buildExpression($columnValue, $params);
                } else {
                    $placeholder = $this->queryBuilder->bindParam($columnValue, $params);
                }
                $vs[] = $quotedColumns[$i] . ($operator === 'IN' ? ' = ' : " {$notEqualOperator} ") . $placeholder;
            }
        }
        $vss[] = '(' . implode($operator === 'IN' ? ' AND ' : ' OR ', $vs) . ')';
    }
    if ($vss === []) {
        return $operator === 'IN' ? '0=1' : '';
    }
    return '(' . implode($operator === 'IN' ? ' OR ' : ' AND ', $vss) . ')';
}

            
buildSubqueryInCondition() protected method

Builds SQL for IN condition.

protected string buildSubqueryInCondition ( string $operator, array|string|yii\db\ExpressionInterface $columns, yii\db\Query $values, array &$params )
$operator string

Operator in uppercase.

$columns array|string|yii\db\ExpressionInterface

The columns to be matched.

$values yii\db\Query

Subquery values.

$params array

The binding parameters.

return string

SQL for IN condition.

throws yii\base\NotSupportedException

if $columns is an array

                protected function buildSubqueryInCondition(
    string $operator,
    array|string|ExpressionInterface $columns,
    Query $values,
    array &$params
): string {
    if (is_array($columns)) {
        throw new NotSupportedException(__METHOD__ . ' is not supported by SQLite.');
    }
    return parent::buildSubqueryInCondition($operator, $columns, $values, $params);
}

            
buildValues() protected method
protected array buildValues ( yii\db\conditions\ConditionInterface|yii\db\conditions\InCondition $condition, array $values, array &$params )
$condition yii\db\conditions\ConditionInterface|yii\db\conditions\InCondition

The condition to be built.

$values array

The values to bind.

$params array

The binding parameters.

return array

Prepared SQL placeholders.

                protected function buildValues(ConditionInterface $condition, array $values, array &$params): array
{
    $sqlValues = [];
    $column = $condition->getColumn();
    if (is_array($column)) {
        $column = reset($column);
    }
    $columnKey = $this->resolveColumnKey($column);
    foreach ($values as $i => $value) {
        if (is_array($value) || $value instanceof ArrayAccess) {
            $value = $columnKey !== null ? ($value[$columnKey] ?? null) : null;
        }
        if ($value === null) {
            continue;
        } elseif ($value instanceof ExpressionInterface) {
            $sqlValues[$i] = $this->queryBuilder->buildExpression($value, $params);
        } else {
            $sqlValues[$i] = $this->queryBuilder->bindParam($value, $params);
        }
    }
    return $sqlValues;
}

            
getNotEqualOperator() protected method

Returns inequality operator for decomposed NOT IN conditions.

protected string getNotEqualOperator ( )
return string

Inequality operator.

                protected function getNotEqualOperator(): string
{
    return '!=';
}

            
getNullCondition() protected method (available since version 2.0.31)

Defined in: yii\db\conditions\InConditionBuilder::getNullCondition()

Builds IS NULL / IS NOT NULL condition for a scalar column based on the operator.

protected string getNullCondition ( string $operator, string $column )
$operator string

Operator in uppercase.

$column string

Column to be matched.

return string

Null condition SQL.

                protected function getNullCondition(string $operator, string $column): string
{
    $column = $this->queryBuilder->db->quoteColumnName($column);
    return $column . ($operator === 'IN' ? ' IS NULL' : ' IS NOT NULL');
}