Commit 089eeaa5 by Qiang Xue

Merge pull request #1560 from cebe/1545-query-reuse

make Query reuseable
parents b59b77cd b2d91669
...@@ -123,6 +123,9 @@ class ActiveQuery extends Query implements ActiveQueryInterface ...@@ -123,6 +123,9 @@ class ActiveQuery extends Query implements ActiveQueryInterface
} }
if ($this->sql === null) { if ($this->sql === null) {
$select = $this->select;
$from = $this->from;
if ($this->from === null) { if ($this->from === null) {
$tableName = $modelClass::tableName(); $tableName = $modelClass::tableName();
if ($this->select === null && !empty($this->join)) { if ($this->select === null && !empty($this->join)) {
...@@ -130,8 +133,14 @@ class ActiveQuery extends Query implements ActiveQueryInterface ...@@ -130,8 +133,14 @@ class ActiveQuery extends Query implements ActiveQueryInterface
} }
$this->from = [$tableName]; $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);
} }
} }
...@@ -190,8 +190,7 @@ class Query extends Component implements QueryInterface ...@@ -190,8 +190,7 @@ class Query extends Component implements QueryInterface
*/ */
public function count($q = '*', $db = null) public function count($q = '*', $db = null)
{ {
$this->select = ["COUNT($q)"]; return $this->queryScalar("COUNT($q)", $db);
return $this->createCommand($db)->queryScalar();
} }
/** /**
...@@ -204,8 +203,7 @@ class Query extends Component implements QueryInterface ...@@ -204,8 +203,7 @@ class Query extends Component implements QueryInterface
*/ */
public function sum($q, $db = null) public function sum($q, $db = null)
{ {
$this->select = ["SUM($q)"]; return $this->queryScalar("SUM($q)", $db);
return $this->createCommand($db)->queryScalar();
} }
/** /**
...@@ -218,8 +216,7 @@ class Query extends Component implements QueryInterface ...@@ -218,8 +216,7 @@ class Query extends Component implements QueryInterface
*/ */
public function average($q, $db = null) public function average($q, $db = null)
{ {
$this->select = ["AVG($q)"]; return $this->queryScalar("AVG($q)", $db);
return $this->createCommand($db)->queryScalar();
} }
/** /**
...@@ -232,8 +229,7 @@ class Query extends Component implements QueryInterface ...@@ -232,8 +229,7 @@ class Query extends Component implements QueryInterface
*/ */
public function min($q, $db = null) public function min($q, $db = null)
{ {
$this->select = ["MIN($q)"]; return $this->queryScalar("MIN($q)", $db);
return $this->createCommand($db)->queryScalar();
} }
/** /**
...@@ -246,8 +242,7 @@ class Query extends Component implements QueryInterface ...@@ -246,8 +242,7 @@ class Query extends Component implements QueryInterface
*/ */
public function max($q, $db = null) public function max($q, $db = null)
{ {
$this->select = ["MAX($q)"]; return $this->queryScalar("MAX($q)", $db);
return $this->createCommand($db)->queryScalar();
} }
/** /**
...@@ -258,8 +253,23 @@ class Query extends Component implements QueryInterface ...@@ -258,8 +253,23 @@ class Query extends Component implements QueryInterface
*/ */
public function exists($db = null) public function exists($db = null)
{ {
$this->select = [new Expression('1')]; return $this->queryScalar(new Expression('1'), $db) !== false;
return $this->scalar($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 = [$selectExpression];
$command = $this->createCommand($db);
$this->select = $select;
return $command->queryScalar();
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment