From 292a9ff55b22e61271b07ededf9ab258f5c1711d Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Fri, 17 Oct 2014 13:32:54 +0200 Subject: [PATCH] Add support for yii\db\Expression to QueryBuiler simple conditions fixes #5601 --- extensions/sphinx/CHANGELOG.md | 3 ++- extensions/sphinx/QueryBuilder.php | 5 +++++ framework/CHANGELOG.md | 5 +++-- framework/db/QueryBuilder.php | 5 +++++ tests/unit/framework/db/QueryBuilderTest.php | 3 +++ 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/extensions/sphinx/CHANGELOG.md b/extensions/sphinx/CHANGELOG.md index 8dca261414..56c78c1863 100644 --- a/extensions/sphinx/CHANGELOG.md +++ b/extensions/sphinx/CHANGELOG.md @@ -4,7 +4,7 @@ Yii Framework 2 sphinx extension Change Log 2.0.1 under development ----------------------- -- no changes in this release. +- Bug #5601: Simple conditions in Query::where() and ActiveQuery::where() did not allow `yii\db\Expression` to be used as the value (cebe, stevekr) 2.0.0 October 12, 2014 @@ -41,6 +41,7 @@ Yii Framework 2 sphinx extension Change Log All relational queries are now directly served by `ActiveQuery` allowing to use custom scopes in relations (cebe) + 2.0.0-alpha, December 1, 2013 ----------------------------- diff --git a/extensions/sphinx/QueryBuilder.php b/extensions/sphinx/QueryBuilder.php index e5e9cf4467..40534b0115 100644 --- a/extensions/sphinx/QueryBuilder.php +++ b/extensions/sphinx/QueryBuilder.php @@ -1085,6 +1085,11 @@ class QueryBuilder extends Object if ($value === null) { return "$column $operator NULL"; + } elseif ($value instanceof Expression) { + foreach ($value->params as $n => $v) { + $params[$n] = $v; + } + return "$column $operator {$value->expression}"; } else { $phName = self::PARAM_PREFIX . count($params); $params[$phName] = $value; diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e8335bb1de..915d62b228 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,10 +4,11 @@ Yii Framework 2 Change Log 2.0.1 under development ----------------------- +- Bug #5584: `yii\rbac\DbRbacManager` should not delete items when deleting a rule on a database not supporting cascade update (mdmunir) +- Bug #5601: Simple conditions in Query::where() and ActiveQuery::where() did not allow `yii\db\Expression` to be used as the value (cebe, stevekr) +- Bug: Gii console command help information does not contain global options (qiangxue) - Enh #5600: Allow configuring debug panels in `yii\debug\Module::panels` as panel class name strings (qiangxue) - Enh #5613: Added `--overwrite` option to Gii console command to support overwriting all files (motin, qiangxue) -- Bug #5584: `yii\rbac\DbRbacManager` should not delete items when deleting a rule on a database not supporting cascade update (mdmunir) -- Bug: Gii console command help information does not contain global options (qiangxue) 2.0.0 October 12, 2014 diff --git a/framework/db/QueryBuilder.php b/framework/db/QueryBuilder.php index cbee58dfe4..7ef66bd27a 100644 --- a/framework/db/QueryBuilder.php +++ b/framework/db/QueryBuilder.php @@ -1238,6 +1238,11 @@ class QueryBuilder extends \yii\base\Object if ($value === null) { return "$column $operator NULL"; + } elseif ($value instanceof Expression) { + foreach ($value->params as $n => $v) { + $params[$n] = $v; + } + return "$column $operator {$value->expression}"; } else { $phName = self::PARAM_PREFIX . count($params); $params[$phName] = $value; diff --git a/tests/unit/framework/db/QueryBuilderTest.php b/tests/unit/framework/db/QueryBuilderTest.php index 0daaa5829a..5d71f204f2 100644 --- a/tests/unit/framework/db/QueryBuilderTest.php +++ b/tests/unit/framework/db/QueryBuilderTest.php @@ -2,6 +2,7 @@ namespace yiiunit\framework\db; +use yii\db\Expression; use yii\db\Query; use yii\db\QueryBuilder; use yii\db\Schema; @@ -193,6 +194,8 @@ class QueryBuilderTest extends DatabaseTestCase [ ['<=', 'a', 'b'], '"a" <= :qp0', [':qp0' => 'b'] ], [ ['<>', 'a', 3], '"a" <> :qp0', [':qp0' => 3] ], [ ['!=', 'a', 'b'], '"a" != :qp0', [':qp0' => 'b'] ], + [ ['>=', 'date', new Expression('DATE_SUB(NOW(), INTERVAL 1 MONTH)')], '"date" >= DATE_SUB(NOW(), INTERVAL 1 MONTH)', [] ], + [ ['>=', 'date', new Expression('DATE_SUB(NOW(), INTERVAL :month MONTH)', [':month' => 2])], '"date" >= DATE_SUB(NOW(), INTERVAL :month MONTH)', [':month' => 2] ], ]; // adjust dbms specific escaping