ActiveQuery.php 4.2 KB
Newer Older
Paul Klimov committed
1 2 3 4 5 6 7
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

8
namespace yii\mongodb\file;
Paul Klimov committed
9 10 11

use yii\db\ActiveQueryInterface;
use yii\db\ActiveQueryTrait;
12
use yii\db\ActiveRelationTrait;
Paul Klimov committed
13 14

/**
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 * ActiveQuery represents a Mongo query associated with an file Active Record class.
 *
 * ActiveQuery instances are usually created by [[ActiveRecord::find()]].
 *
 * Because ActiveQuery extends from [[Query]], one can use query methods, such as [[where()]],
 * [[orderBy()]] to customize the query options.
 *
 * ActiveQuery also provides the following additional query options:
 *
 * - [[with()]]: list of relations that this query should be performed with.
 * - [[asArray()]]: whether to return each record as an array.
 *
 * These options can be configured using methods of the same name. For example:
 *
 * ~~~
 * $images = ImageFile::find()->with('tags')->asArray()->all();
 * ~~~
Paul Klimov committed
32
 *
Qiang Xue committed
33 34
 * @property Collection $collection Collection instance. This property is read-only.
 *
Paul Klimov committed
35 36 37
 * @author Paul Klimov <klimov.paul@gmail.com>
 * @since 2.0
 */
38
class ActiveQuery extends Query implements ActiveQueryInterface
Paul Klimov committed
39
{
40 41
    use ActiveQueryTrait;
    use ActiveRelationTrait;
Paul Klimov committed
42

Qiang Xue committed
43 44 45 46 47 48 49 50 51 52 53 54

    /**
     * Constructor.
     * @param array $modelClass the model class associated with this query
     * @param array $config configurations to be applied to the newly created query object
     */
    public function __construct($modelClass, $config = [])
    {
        $this->modelClass = $modelClass;
        parent::__construct($config);
    }

55 56
    /**
     * Executes query and returns all results as an array.
57 58 59
     * @param \yii\mongodb\Connection $db the Mongo connection used to execute the query.
     * If null, the Mongo connection returned by [[modelClass]] will be used.
     * @return array the query results. If the query results in nothing, an empty array will be returned.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
     */
    public function all($db = null)
    {
        $cursor = $this->buildCursor($db);
        $rows = $this->fetchRows($cursor);
        if (!empty($rows)) {
            $models = $this->createModels($rows);
            if (!empty($this->with)) {
                $this->findWith($this->with, $models);
            }
            if (!$this->asArray) {
                foreach ($models as $model) {
                    $model->afterFind();
                }
            }
Paul Klimov committed
75

76 77 78 79 80
            return $models;
        } else {
            return [];
        }
    }
Paul Klimov committed
81

82 83
    /**
     * Executes query and returns a single row of result.
84 85
     * @param \yii\mongodb\Connection $db the Mongo connection used to execute the query.
     * If null, the Mongo connection returned by [[modelClass]] will be used.
86
     * @return ActiveRecord|array|null a single row of query result. Depending on the setting of [[asArray]],
87 88
     * the query result may be either an array or an ActiveRecord object. Null will be returned
     * if the query results in nothing.
89 90 91 92 93 94 95 96
     */
    public function one($db = null)
    {
        $row = parent::one($db);
        if ($row !== false) {
            if ($this->asArray) {
                $model = $row;
            } else {
97
                /* @var $class ActiveRecord */
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
                $class = $this->modelClass;
                $model = $class::instantiate($row);
                $class::populateRecord($model, $row);
            }
            if (!empty($this->with)) {
                $models = [$model];
                $this->findWith($this->with, $models);
                $model = $models[0];
            }
            if (!$this->asArray) {
                $model->afterFind();
            }

            return $model;
        } else {
            return null;
        }
    }

    /**
     * Returns the Mongo collection for this query.
119 120
     * @param \yii\mongodb\Connection $db Mongo connection.
     * @return Collection collection instance.
121 122 123
     */
    public function getCollection($db = null)
    {
124
        /* @var $modelClass ActiveRecord */
125 126 127 128 129 130 131 132 133 134
        $modelClass = $this->modelClass;
        if ($db === null) {
            $db = $modelClass::getDb();
        }
        if ($this->from === null) {
            $this->from = $modelClass::collectionName();
        }

        return $db->getFileCollection($this->from);
    }
AlexGx committed
135
}