Class yii\db\oci\conditions\InConditionBuilder
Protected Properties
| Property | Type | Description | Defined By |
|---|---|---|---|
| $queryBuilder | yii\ |
yii\ |
Public Methods
| Method | Description | Defined By |
|---|---|---|
| __construct() | ExpressionBuilderTrait constructor. | yii\ |
| build() | Method builds the raw SQL from the $expression that will not be additionally escaped or quoted. | 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\ |
| splitCondition() | Oracle DBMS does not support more than 1000 parameters in IN condition. |
yii\ |
Method Details
Defined in:
yii\
ExpressionBuilderTrait constructor.
| public mixed __construct ( yii\ | ||
| $queryBuilder | yii\ |
|
public function __construct(QueryBuilder $queryBuilder)
{
$this->queryBuilder = $queryBuilder;
}
Method builds the raw SQL from the $expression that will not be additionally escaped or quoted.
| 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
{
$splitCondition = $this->splitCondition($expression, $params);
if ($splitCondition !== null) {
return $splitCondition;
}
return parent::build($expression, $params);
}
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) . ')';
}
Defined in:
yii\
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. |
|---|---|---|
protected function buildSubqueryInCondition(
string $operator,
array|string|ExpressionInterface $columns,
Query $values,
array &$params
): string {
$sql = $this->queryBuilder->buildExpression($values, $params);
if (is_array($columns)) {
foreach ($columns as $i => $column) {
$columns[$i] = $this->normalizeColumn($column, $params);
}
return '(' . implode(', ', $columns) . ") $operator $sql";
}
return $this->normalizeColumn($columns, $params) . " $operator $sql";
}
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;
}
Defined in:
yii\
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');
}
Oracle DBMS does not support more than 1000 parameters in IN condition.
This method splits long IN condition into series of smaller ones.
| protected string|null splitCondition ( yii\ | ||
| $condition | yii\ |
The expression to be built. |
| $params | array |
The binding parameters. |
| return | string|null |
Null when split is not required. Otherwise - built SQL condition. |
|---|---|---|
protected function splitCondition(InCondition $condition, array &$params): ?string
{
$operator = strtoupper($condition->getOperator());
$values = $condition->getValues();
$column = $condition->getColumn();
if (!is_array($values)) {
return null;
}
$maxParameters = 1000;
$count = count($values);
if ($count <= $maxParameters) {
return null;
}
$slices = [];
for ($i = 0; $i < $count; $i += $maxParameters) {
$slices[] = $this->queryBuilder->createConditionFromArray(
[
$operator,
$column,
array_slice($values, $i, $maxParameters),
],
);
}
array_unshift($slices, ($operator === 'IN') ? 'OR' : 'AND');
return $this->queryBuilder->buildCondition($slices, $params);
}
User Contributed Notes
Leave a comment
Join the conversation to share a note.