From 124a73a59801d36f065e93d5443c96876506704f Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 17 Dec 2013 15:51:27 +0100 Subject: [PATCH 1/2] make Query reuseable fixes #1545 --- framework/yii/db/ActiveQuery.php | 13 +++++++++++-- framework/yii/db/Query.php | 30 ++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/framework/yii/db/ActiveQuery.php b/framework/yii/db/ActiveQuery.php index 52dbcdb..e93e9be 100644 --- a/framework/yii/db/ActiveQuery.php +++ b/framework/yii/db/ActiveQuery.php @@ -123,6 +123,9 @@ class ActiveQuery extends Query implements ActiveQueryInterface } if ($this->sql === null) { + $select = $this->select; + $from = $this->from; + if ($this->from === null) { $tableName = $modelClass::tableName(); if ($this->select === null && !empty($this->join)) { @@ -130,8 +133,14 @@ class ActiveQuery extends Query implements ActiveQueryInterface } $this->from = [$tableName]; } - list ($this->sql, $this->params) = $db->getQueryBuilder()->build($this); + list ($sql, $params) = $db->getQueryBuilder()->build($this); + + $this->select = $select; + $this->from = $from; + } else { + $sql = $this->sql; + $params = $this->params; } - return $db->createCommand($this->sql, $this->params); + return $db->createCommand($sql, $params); } } diff --git a/framework/yii/db/Query.php b/framework/yii/db/Query.php index 301b2e1..fb1d42f 100644 --- a/framework/yii/db/Query.php +++ b/framework/yii/db/Query.php @@ -190,8 +190,11 @@ class Query extends Component implements QueryInterface */ public function count($q = '*', $db = null) { + $select = $this->select; $this->select = ["COUNT($q)"]; - return $this->createCommand($db)->queryScalar(); + $command = $this->createCommand($db); + $this->select = $select; + return $command->queryScalar(); } /** @@ -204,8 +207,11 @@ class Query extends Component implements QueryInterface */ public function sum($q, $db = null) { + $select = $this->select; $this->select = ["SUM($q)"]; - return $this->createCommand($db)->queryScalar(); + $command = $this->createCommand($db); + $this->select = $select; + return $command->queryScalar(); } /** @@ -218,8 +224,11 @@ class Query extends Component implements QueryInterface */ public function average($q, $db = null) { + $select = $this->select; $this->select = ["AVG($q)"]; - return $this->createCommand($db)->queryScalar(); + $command = $this->createCommand($db); + $this->select = $select; + return $command->queryScalar(); } /** @@ -232,8 +241,11 @@ class Query extends Component implements QueryInterface */ public function min($q, $db = null) { + $select = $this->select; $this->select = ["MIN($q)"]; - return $this->createCommand($db)->queryScalar(); + $command = $this->createCommand($db); + $this->select = $select; + return $command->queryScalar(); } /** @@ -246,8 +258,11 @@ class Query extends Component implements QueryInterface */ public function max($q, $db = null) { + $select = $this->select; $this->select = ["MAX($q)"]; - return $this->createCommand($db)->queryScalar(); + $command = $this->createCommand($db); + $this->select = $select; + return $command->queryScalar(); } /** @@ -258,8 +273,11 @@ class Query extends Component implements QueryInterface */ public function exists($db = null) { + $select = $this->select; $this->select = [new Expression('1')]; - return $this->scalar($db) !== false; + $command = $this->createCommand($db); + $this->select = $select; + return $command->queryScalar() !== false; } /** From b2d9166927d6e5156ef2d1d037dd08517fa87086 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 17 Dec 2013 16:14:27 +0100 Subject: [PATCH 2/2] refactored scalar query functions to share common code --- framework/yii/db/Query.php | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/framework/yii/db/Query.php b/framework/yii/db/Query.php index fb1d42f..0d81887 100644 --- a/framework/yii/db/Query.php +++ b/framework/yii/db/Query.php @@ -190,11 +190,7 @@ class Query extends Component implements QueryInterface */ public function count($q = '*', $db = null) { - $select = $this->select; - $this->select = ["COUNT($q)"]; - $command = $this->createCommand($db); - $this->select = $select; - return $command->queryScalar(); + return $this->queryScalar("COUNT($q)", $db); } /** @@ -207,11 +203,7 @@ class Query extends Component implements QueryInterface */ public function sum($q, $db = null) { - $select = $this->select; - $this->select = ["SUM($q)"]; - $command = $this->createCommand($db); - $this->select = $select; - return $command->queryScalar(); + return $this->queryScalar("SUM($q)", $db); } /** @@ -224,11 +216,7 @@ class Query extends Component implements QueryInterface */ public function average($q, $db = null) { - $select = $this->select; - $this->select = ["AVG($q)"]; - $command = $this->createCommand($db); - $this->select = $select; - return $command->queryScalar(); + return $this->queryScalar("AVG($q)", $db); } /** @@ -241,11 +229,7 @@ class Query extends Component implements QueryInterface */ public function min($q, $db = null) { - $select = $this->select; - $this->select = ["MIN($q)"]; - $command = $this->createCommand($db); - $this->select = $select; - return $command->queryScalar(); + return $this->queryScalar("MIN($q)", $db); } /** @@ -258,11 +242,7 @@ class Query extends Component implements QueryInterface */ public function max($q, $db = null) { - $select = $this->select; - $this->select = ["MAX($q)"]; - $command = $this->createCommand($db); - $this->select = $select; - return $command->queryScalar(); + return $this->queryScalar("MAX($q)", $db); } /** @@ -273,11 +253,23 @@ class Query extends Component implements QueryInterface */ public function exists($db = null) { + return $this->queryScalar(new Expression('1'), $db) !== false; + } + + /** + * Queries a scalar value by setting [[select]] first. + * Restores the value of select to make this query reusable. + * @param string|Expression $selectExpression + * @param Connection $db + * @return bool|string + */ + private function queryScalar($selectExpression, $db) + { $select = $this->select; - $this->select = [new Expression('1')]; + $this->select = [$selectExpression]; $command = $this->createCommand($db); $this->select = $select; - return $command->queryScalar() !== false; + return $command->queryScalar(); } /**