diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index bd9440fca7..166d689da0 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -19,6 +19,7 @@ Yii Framework 2 Change Log - Enh #17993: Added `yii\i18n\Formatter::$currencyDecimalSeparator` to allow setting custom symbols for currency decimal in IntlNumberFormatter (XPOHOC269) - Bug #18000: PK value of Oracle ActiveRecord is missing after save (mankwok) - Enh #18006: Allow SameSite cookie pre PHP 7.3 (scottix) +- Bug #18010: Allow upper or lower case operators in `InCondition` and `LikeCondition` (alex-code) 2.0.34 March 26, 2020 diff --git a/framework/db/conditions/InConditionBuilder.php b/framework/db/conditions/InConditionBuilder.php index 684ec0db73..f685216c11 100644 --- a/framework/db/conditions/InConditionBuilder.php +++ b/framework/db/conditions/InConditionBuilder.php @@ -33,7 +33,7 @@ class InConditionBuilder implements ExpressionBuilderInterface */ public function build(ExpressionInterface $expression, array &$params = []) { - $operator = $expression->getOperator(); + $operator = strtoupper($expression->getOperator()); $column = $expression->getColumn(); $values = $expression->getValues(); diff --git a/framework/db/conditions/LikeConditionBuilder.php b/framework/db/conditions/LikeConditionBuilder.php index 62c3751705..8071efd639 100644 --- a/framework/db/conditions/LikeConditionBuilder.php +++ b/framework/db/conditions/LikeConditionBuilder.php @@ -48,7 +48,7 @@ class LikeConditionBuilder implements ExpressionBuilderInterface */ public function build(ExpressionInterface $expression, array &$params = []) { - $operator = $expression->getOperator(); + $operator = strtoupper($expression->getOperator()); $column = $expression->getColumn(); $values = $expression->getValue(); $escape = $expression->getEscapingReplacements(); diff --git a/tests/framework/db/QueryBuilderTest.php b/tests/framework/db/QueryBuilderTest.php index f308b8048b..f578388de3 100644 --- a/tests/framework/db/QueryBuilderTest.php +++ b/tests/framework/db/QueryBuilderTest.php @@ -9,6 +9,8 @@ namespace yiiunit\framework\db; use yii\db\ColumnSchemaBuilder; use yii\db\conditions\BetweenColumnsCondition; +use yii\db\conditions\LikeCondition; +use yii\db\conditions\InCondition; use yii\db\cubrid\QueryBuilder as CubridQueryBuilder; use yii\db\Expression; use yii\db\mssql\QueryBuilder as MssqlQueryBuilder; @@ -1198,6 +1200,15 @@ abstract class QueryBuilderTest extends DatabaseTestCase '([[id]], [[name]]) IN ((:qp0, :qp1), (:qp2, :qp3))', [':qp0' => 1, ':qp1' => 'oy', ':qp2' => 2, ':qp3' => 'yo'], ], + + // in object conditions + [new InCondition('id', 'in', 1), '[[id]]=:qp0', [':qp0' => 1]], + [new InCondition('id', 'in', [1]), '[[id]]=:qp0', [':qp0' => 1]], + [new InCondition('id', 'not in', 1), '[[id]]<>:qp0', [':qp0' => 1]], + [new InCondition('id', 'not in', [1]), '[[id]]<>:qp0', [':qp0' => 1]], + [new InCondition('id', 'in', [1, 2]), '[[id]] IN (:qp0, :qp1)', [':qp0' => 1, ':qp1' => 2]], + [new InCondition('id', 'not in', [1, 2]), '[[id]] NOT IN (:qp0, :qp1)', [':qp0' => 1, ':qp1' => 2]], + // exists [['exists', (new Query())->select('id')->from('users')->where(['active' => 1])], 'EXISTS (SELECT [[id]] FROM [[users]] WHERE [[active]]=:qp0)', [':qp0' => 1]], [['not exists', (new Query())->select('id')->from('users')->where(['active' => 1])], 'NOT EXISTS (SELECT [[id]] FROM [[users]] WHERE [[active]]=:qp0)', [':qp0' => 1]], @@ -2469,6 +2480,16 @@ abstract class QueryBuilderTest extends DatabaseTestCase '[[location]].[[title_ru]] LIKE :qp0', [':qp0' => 'vi%'], ], + + // like object conditions + [new LikeCondition('name', 'like', new Expression('CONCAT("test", name, "%")')), '[[name]] LIKE CONCAT("test", name, "%")', []], + [new LikeCondition('name', 'not like', new Expression('CONCAT("test", name, "%")')), '[[name]] NOT LIKE CONCAT("test", name, "%")', []], + [new LikeCondition('name', 'or like', new Expression('CONCAT("test", name, "%")')), '[[name]] LIKE CONCAT("test", name, "%")', []], + [new LikeCondition('name', 'or not like', new Expression('CONCAT("test", name, "%")')), '[[name]] NOT LIKE CONCAT("test", name, "%")', []], + [new LikeCondition('name', 'like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] LIKE CONCAT("test", name, "%") AND [[name]] LIKE :qp0', [':qp0' => '%\\\ab\_c%']], + [new LikeCondition('name', 'not like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] NOT LIKE CONCAT("test", name, "%") AND [[name]] NOT LIKE :qp0', [':qp0' => '%\\\ab\_c%']], + [new LikeCondition('name', 'or like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] LIKE CONCAT("test", name, "%") OR [[name]] LIKE :qp0', [':qp0' => '%\\\ab\_c%']], + [new LikeCondition('name', 'or not like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] NOT LIKE CONCAT("test", name, "%") OR [[name]] NOT LIKE :qp0', [':qp0' => '%\\\ab\_c%']], ]; // adjust dbms specific escaping