diff --git a/framework/db/QueryBuilder.php b/framework/db/QueryBuilder.php index 5de2747405..17036bda63 100644 --- a/framework/db/QueryBuilder.php +++ b/framework/db/QueryBuilder.php @@ -1491,15 +1491,17 @@ class QueryBuilder extends \yii\base\BaseObject public function buildCondition($condition, &$params) { if (is_array($condition)) { + if (empty($condition)) { + return ''; + } + $condition = $this->createConditionFromArray($condition); } if ($condition instanceof ExpressionInterface) { return $this->buildExpression($condition, $params); } - if (empty($condition)) { - return ''; - } + return (string) $condition; } diff --git a/framework/db/conditions/ConjunctionConditionBuilder.php b/framework/db/conditions/ConjunctionConditionBuilder.php index a1fea5b622..5ccd721b02 100644 --- a/framework/db/conditions/ConjunctionConditionBuilder.php +++ b/framework/db/conditions/ConjunctionConditionBuilder.php @@ -28,11 +28,15 @@ class ConjunctionConditionBuilder implements ExpressionBuilderInterface { $parts = $this->buildExpressionsFrom($condition, $params); - if (!empty($parts)) { - return '(' . implode(") {$condition->getOperator()} (", $parts) . ')'; + if (empty($parts)) { + return ''; } - return ''; + if (count($parts) === 1) { + return reset($parts); + } + + return '(' . implode(") {$condition->getOperator()} (", $parts) . ')'; } /** diff --git a/tests/framework/db/QueryBuilderTest.php b/tests/framework/db/QueryBuilderTest.php index 10b706d412..73ca635556 100644 --- a/tests/framework/db/QueryBuilderTest.php +++ b/tests/framework/db/QueryBuilderTest.php @@ -2359,4 +2359,22 @@ abstract class QueryBuilderTest extends DatabaseTestCase $this->assertEquals('SELECT *' . (empty($expected) ? '' : ' WHERE ' . $this->replaceQuotes($expected)), $sql); $this->assertEquals($expectedParams, $params); } + + /** + * @see https://github.com/yiisoft/yii2/issues/15653 + */ + public function testIssue15653() + { + $query = (new Query()) + ->from('admin_user') + ->where(['is_deleted' => false]); + + $query + ->where([]) + ->andWhere(['in', 'id', ['1', '0']]); + + list($sql, $params) = $this->getQueryBuilder()->build($query); + $this->assertSame("SELECT * FROM `admin_user` WHERE `id` IN (:qp0, :qp1)", $sql); + $this->assertSame([':qp0' => '1', ':qp1' => '0'], $params); + } }