Fixes #16081: Fixed composite IN using just one column

This commit is contained in:
Pavel Ivanov
2018-12-31 13:41:25 +02:00
committed by Alexander Makarov
parent ebb5976a22
commit b128ec85f4
3 changed files with 37 additions and 4 deletions

View File

@ -4,6 +4,7 @@ Yii Framework 2 Change Log
2.0.16 under development
------------------------
- Bug #16081: Fixed composite IN using just one column (rugabarbo)
- Bug #16926: Fix shell autocompletion (GHopperMSK)
- Bug #15850: check basePath is writable on publish in AssetManager (Groonya)
- Bug #16910: Fix messages sorting on extract (Groonya)

View File

@ -50,12 +50,22 @@ class InConditionBuilder implements ExpressionBuilderInterface
// ensure values is an array
$values = (array) $values;
}
if ($column instanceof \Traversable || ((is_array($column) || $column instanceof \Countable) && count($column) > 1)) {
return $this->buildCompositeInCondition($operator, $column, $values, $params);
}
if (is_array($column)) {
$column = reset($column);
if (count($column) > 1) {
return $this->buildCompositeInCondition($operator, $column, $values, $params);
} else {
$column = reset($column);
}
}
if ($column instanceof \Traversable) {
if (iterator_count($column) > 1) {
return $this->buildCompositeInCondition($operator, $column, $values, $params);
} else {
$column->rewind();
$column = $column->current();
}
}
$sqlValues = $this->buildValues($expression, $values, $params);
@ -88,6 +98,15 @@ class InConditionBuilder implements ExpressionBuilderInterface
$sqlValues = [];
$column = $condition->getColumn();
if (is_array($column)) {
$column = reset($column);
}
if ($column instanceof \Traversable) {
$column->rewind();
$column = $column->current();
}
foreach ($values as $i => $value) {
if (is_array($value) || $value instanceof \ArrayAccess) {
$value = isset($value[$column]) ? $value[$column] : null;