ActiveQuery.php 5.89 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

43 44 45 46 47
    /**
     * @event Event an event that is triggered when the query is initialized via [[init()]].
     */
    const EVENT_INIT = 'init';

Qiang Xue committed
48 49 50 51 52 53 54 55 56 57 58 59

    /**
     * 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);
    }

60 61 62 63 64 65 66 67 68 69 70 71
    /**
     * Initializes the object.
     * This method is called at the end of the constructor. The default implementation will trigger
     * an [[EVENT_INIT]] event. If you override this method, make sure you call the parent implementation at the end
     * to ensure triggering of the event.
     */
    public function init()
    {
        parent::init();
        $this->trigger(self::EVENT_INIT);
    }

72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    /**
     * @inheritdoc
     */
    protected function buildCursor($db = null)
    {
        if ($this->primaryModel !== null) {
            // lazy loading
            if ($this->via instanceof self) {
                // via pivot collection
                $viaModels = $this->via->findJunctionRows([$this->primaryModel]);
                $this->filterByModels($viaModels);
            } elseif (is_array($this->via)) {
                // via relation
                /* @var $viaQuery ActiveQuery */
                list($viaName, $viaQuery) = $this->via;
                if ($viaQuery->multiple) {
                    $viaModels = $viaQuery->all();
                    $this->primaryModel->populateRelation($viaName, $viaModels);
                } else {
                    $model = $viaQuery->one();
                    $this->primaryModel->populateRelation($viaName, $model);
                    $viaModels = $model === null ? [] : [$model];
                }
                $this->filterByModels($viaModels);
            } else {
                $this->filterByModels([$this->primaryModel]);
            }
        }

        return parent::buildCursor($db);
    }

104 105
    /**
     * Executes query and returns all results as an array.
106 107 108
     * @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.
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
     */
    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
124

125 126 127 128 129
            return $models;
        } else {
            return [];
        }
    }
Paul Klimov committed
130

131 132
    /**
     * Executes query and returns a single row of result.
133 134
     * @param \yii\mongodb\Connection $db the Mongo connection used to execute the query.
     * If null, the Mongo connection returned by [[modelClass]] will be used.
135
     * @return ActiveRecord|array|null a single row of query result. Depending on the setting of [[asArray]],
136 137
     * the query result may be either an array or an ActiveRecord object. Null will be returned
     * if the query results in nothing.
138 139 140 141 142 143 144 145
     */
    public function one($db = null)
    {
        $row = parent::one($db);
        if ($row !== false) {
            if ($this->asArray) {
                $model = $row;
            } else {
146
                /* @var $class ActiveRecord */
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
                $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.
168 169
     * @param \yii\mongodb\Connection $db Mongo connection.
     * @return Collection collection instance.
170 171 172
     */
    public function getCollection($db = null)
    {
173
        /* @var $modelClass ActiveRecord */
174 175 176 177 178 179 180 181 182 183
        $modelClass = $this->modelClass;
        if ($db === null) {
            $db = $modelClass::getDb();
        }
        if ($this->from === null) {
            $this->from = $modelClass::collectionName();
        }

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