Class yii\db\sqlite\conditions\InConditionBuilder
| Inheritance | yii\ |
|---|---|
| Implements | yii\ |
| Uses Traits | yii\ |
| Available since version | 2.0.14 |
| Source Code | https://github.com/yiisoft/yii2/blob/master/framework/db/sqlite/conditions/InConditionBuilder.php |
Protected Properties
| Property | Type | Description | Defined By |
|---|---|---|---|
| $queryBuilder | yii\ |
yii\ |
Public Methods
| Method | Description | Defined By |
|---|---|---|
| __construct() | ExpressionBuilderTrait constructor. | yii\ |
| build() | Builds raw SQL from the expression. | yii\ |
Protected Methods
| Method | Description | Defined By |
|---|---|---|
| buildCompositeInCondition() | Builds SQL for composite IN condition. | yii\ |
| buildSubqueryInCondition() | Builds SQL for IN condition. | yii\ |
| buildValues() | Builds values to be used in yii\ |
yii\ |
| getNotEqualOperator() | Returns inequality operator for decomposed NOT IN conditions. |
yii\ |
| getNullCondition() | Builds IS NULL / IS NOT NULL condition for a scalar column based on the operator. |
yii\ |
Method Details
Defined in:
yii\
ExpressionBuilderTrait constructor.
| public mixed __construct ( yii\ | ||
| $queryBuilder | yii\ |
|
public function __construct(QueryBuilder $queryBuilder)
{
$this->queryBuilder = $queryBuilder;
}
Defined in:
yii\
Builds raw SQL from the expression.
| public string build ( yii\ | ||
| $expression | yii\ |
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;
}
Defined in:
yii\
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) . ')';
}
Builds SQL for IN condition.
| protected string buildSubqueryInCondition ( string $operator, array|string|yii\ | ||
| $operator | string |
Operator in uppercase. |
| $columns | array|string|yii\ |
The columns to be matched. |
| $values | yii\ |
Subquery values. |
| $params | array |
The binding parameters. |
| return | string |
SQL for IN condition. |
|---|---|---|
| throws | yii\ |
if |
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);
}
Defined in:
yii\
Builds values to be used in yii\
| protected array buildValues ( yii\ | ||
| $condition | yii\ |
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;
}
Returns inequality operator for decomposed NOT IN conditions.
| protected string getNotEqualOperator ( ) | ||
| return | string |
Inequality operator. |
|---|---|---|
protected function getNotEqualOperator(): string
{
return '!=';
}
Defined in:
yii\
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');
}
User Contributed Notes
Leave a comment
Join the conversation to share a note.