Commit 86c93cf4 by Carsten Brandt

diff between db\ActiveQuery and redis\ActiveQuery

parent 142ea1f9
...@@ -12,10 +12,10 @@ namespace yii\redis; ...@@ -12,10 +12,10 @@ namespace yii\redis;
use yii\base\NotSupportedException; use yii\base\NotSupportedException;
/** /**
* ActiveQuery represents a DB query associated with an Active Record class. * ActiveQuery represents a query associated with an Active Record class.
* *
* ActiveQuery instances are usually created by [[yii\db\redis\ActiveRecord::find()]] * ActiveQuery instances are usually created by [[ActiveRecord::find()]]
* and [[yii\db\redis\ActiveRecord::count()]]. * and [[ActiveRecord::count()]].
* *
* ActiveQuery mainly provides the following methods to retrieve the query results: * ActiveQuery mainly provides the following methods to retrieve the query results:
* *
...@@ -29,7 +29,7 @@ use yii\base\NotSupportedException; ...@@ -29,7 +29,7 @@ use yii\base\NotSupportedException;
* - [[scalar()]]: returns the value of the first column in the first row of the query result. * - [[scalar()]]: returns the value of the first column in the first row of the query result.
* - [[exists()]]: returns a value indicating whether the query result has data or not. * - [[exists()]]: returns a value indicating whether the query result has data or not.
* *
* You can use query methods, such as [[limit()]], [[orderBy()]] to customize the query options. * You can use query methods, such as [[where()]], [[limit()]] and [[orderBy()]] to customize the query options.
* *
* ActiveQuery also provides the following additional query options: * ActiveQuery also provides the following additional query options:
* *
...@@ -49,6 +49,17 @@ use yii\base\NotSupportedException; ...@@ -49,6 +49,17 @@ use yii\base\NotSupportedException;
class ActiveQuery extends \yii\base\Component class ActiveQuery extends \yii\base\Component
{ {
/** /**
* Sort ascending
* @see orderBy
*/
const SORT_ASC = false;
/**
* Sort descending
* @see orderBy
*/
const SORT_DESC = true;
/**
* @var string the name of the ActiveRecord class. * @var string the name of the ActiveRecord class.
*/ */
public $modelClass; public $modelClass;
...@@ -57,12 +68,18 @@ class ActiveQuery extends \yii\base\Component ...@@ -57,12 +68,18 @@ class ActiveQuery extends \yii\base\Component
*/ */
public $with; public $with;
/** /**
* @var string|callable $column the name of the column by which the query results should be indexed by.
* This can also be a callable (e.g. anonymous function) that returns the index value based on the given
* row or model data. For more details, see [[indexBy()]].
*/
public $indexBy;
/**
* @var boolean whether to return each record as an array. If false (default), an object * @var boolean whether to return each record as an array. If false (default), an object
* of [[modelClass]] will be created to represent each record. * of [[modelClass]] will be created to represent each record.
*/ */
public $asArray; public $asArray;
/** /**
* @var array query condition. This refers to the WHERE clause in a SQL statement. * @var array the query condition.
* @see where() * @see where()
*/ */
public $where; public $where;
...@@ -79,15 +96,10 @@ class ActiveQuery extends \yii\base\Component ...@@ -79,15 +96,10 @@ class ActiveQuery extends \yii\base\Component
/** /**
* @var array how to sort the query results. This is used to construct the ORDER BY clause in a SQL statement. * @var array how to sort the query results. This is used to construct the ORDER BY clause in a SQL statement.
* The array keys are the columns to be sorted by, and the array values are the corresponding sort directions which * The array keys are the columns to be sorted by, and the array values are the corresponding sort directions which
* can be either [[Query::SORT_ASC]] or [[Query::SORT_DESC]]. The array may also contain [[Expression]] objects. * can be either [[ActiveQuery::SORT_ASC]] or [[ActiveQuery::SORT_DESC]]. The array may also contain [[Expression]] objects.
* If that is the case, the expressions will be converted into strings without any change. * If that is the case, the expressions will be converted into strings without any change.
*/ */
public $orderBy; public $orderBy;
/**
* @var string the name of the column by which query results should be indexed by.
* This is only used when the query result is returned as an array when calling [[all()]].
*/
public $indexBy;
/** /**
* PHP magic method. * PHP magic method.
...@@ -125,8 +137,7 @@ class ActiveQuery extends \yii\base\Component ...@@ -125,8 +137,7 @@ class ActiveQuery extends \yii\base\Component
} }
$rows[] = $row; $rows[] = $row;
} }
if (!empty($rows)) {
if ($rows !== array()) {
$models = $this->createModels($rows); $models = $this->createModels($rows);
if (!empty($this->with)) { if (!empty($this->with)) {
$this->populateRelations($models, $this->with); $this->populateRelations($models, $this->with);
...@@ -155,19 +166,19 @@ class ActiveQuery extends \yii\base\Component ...@@ -155,19 +166,19 @@ class ActiveQuery extends \yii\base\Component
for($i = 0; $i < $c; ) { for($i = 0; $i < $c; ) {
$row[$data[$i++]] = $data[$i++]; $row[$data[$i++]] = $data[$i++];
} }
if (!$this->asArray) { if ($this->asArray) {
$model = $row;
} else {
/** @var $class ActiveRecord */ /** @var $class ActiveRecord */
$class = $this->modelClass; $class = $this->modelClass;
$model = $class::create($row); $model = $class::create($row);
if (!empty($this->with)) {
$models = array($model);
$this->populateRelations($models, $this->with);
$model = $models[0];
}
return $model;
} else {
return $row;
} }
if (!empty($this->with)) {
$models = array($model);
$this->populateRelations($models, $this->with);
$model = $models[0];
}
return $model;
} }
/** /**
...@@ -389,6 +400,8 @@ class ActiveQuery extends \yii\base\Component ...@@ -389,6 +400,8 @@ class ActiveQuery extends \yii\base\Component
return false; return false;
} }
// TODO: refactor. code below here is all duplicated from yii/db/ActiveQuery and yii/db/Query
/** /**
* Sets the [[asArray]] property. * Sets the [[asArray]] property.
* @param boolean $value whether to return the query results in terms of arrays instead of Active Records. * @param boolean $value whether to return the query results in terms of arrays instead of Active Records.
...@@ -512,7 +525,19 @@ class ActiveQuery extends \yii\base\Component ...@@ -512,7 +525,19 @@ class ActiveQuery extends \yii\base\Component
/** /**
* Sets the [[indexBy]] property. * Sets the [[indexBy]] property.
* @param string $column the name of the column by which the query results should be indexed by. * @param string|callable $column the name of the column by which the query results should be indexed by.
* This can also be a callable (e.g. anonymous function) that returns the index value based on the given
* row or model data. The signature of the callable should be:
*
* ~~~
* // $model is an AR instance when `asArray` is false,
* // or an array of column values when `asArray` is true.
* function ($model)
* {
* // return the index value corresponding to $model
* }
* ~~~
*
* @return ActiveQuery the query object itself * @return ActiveQuery the query object itself
*/ */
public function indexBy($column) public function indexBy($column)
...@@ -633,7 +658,6 @@ class ActiveQuery extends \yii\base\Component ...@@ -633,7 +658,6 @@ class ActiveQuery extends \yii\base\Component
return $this; return $this;
} }
// TODO: refactor, it is duplicated from yii/db/ActiveQuery
private function createModels($rows) private function createModels($rows)
{ {
$models = array(); $models = array();
...@@ -671,7 +695,6 @@ class ActiveQuery extends \yii\base\Component ...@@ -671,7 +695,6 @@ class ActiveQuery extends \yii\base\Component
return $models; return $models;
} }
// TODO: refactor, it is duplicated from yii/db/ActiveQuery
private function populateRelations(&$models, $with) private function populateRelations(&$models, $with)
{ {
$primaryModel = new $this->modelClass; $primaryModel = new $this->modelClass;
...@@ -686,7 +709,6 @@ class ActiveQuery extends \yii\base\Component ...@@ -686,7 +709,6 @@ class ActiveQuery extends \yii\base\Component
} }
/** /**
* TODO: refactor, it is duplicated from yii/db/ActiveQuery
* @param ActiveRecord $model * @param ActiveRecord $model
* @param array $with * @param array $with
* @return ActiveRelation[] * @return ActiveRelation[]
......
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