ActiveQuery.php 4.74 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
    /**
     * Executes query and returns all results as an array.
74 75 76
     * @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.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
     */
    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
92

93 94 95 96 97
            return $models;
        } else {
            return [];
        }
    }
Paul Klimov committed
98

99 100
    /**
     * Executes query and returns a single row of result.
101 102
     * @param \yii\mongodb\Connection $db the Mongo connection used to execute the query.
     * If null, the Mongo connection returned by [[modelClass]] will be used.
103
     * @return ActiveRecord|array|null a single row of query result. Depending on the setting of [[asArray]],
104 105
     * the query result may be either an array or an ActiveRecord object. Null will be returned
     * if the query results in nothing.
106 107 108 109 110 111 112 113
     */
    public function one($db = null)
    {
        $row = parent::one($db);
        if ($row !== false) {
            if ($this->asArray) {
                $model = $row;
            } else {
114
                /* @var $class ActiveRecord */
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
                $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.
136 137
     * @param \yii\mongodb\Connection $db Mongo connection.
     * @return Collection collection instance.
138 139 140
     */
    public function getCollection($db = null)
    {
141
        /* @var $modelClass ActiveRecord */
142 143 144 145 146 147 148 149 150 151
        $modelClass = $this->modelClass;
        if ($db === null) {
            $db = $modelClass::getDb();
        }
        if ($this->from === null) {
            $this->from = $modelClass::collectionName();
        }

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