An ActiveQuery can be a normal query or be used in a relational context. ActiveQuery instances are usually created by [[ActiveRecord::find()]] and [[ActiveRecord::findBySql()]]. Relational queries are created by [[ActiveRecord::hasOne()]] and [[ActiveRecord::hasMany()]]. Normal Query ------------ 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. - [[indexBy()]]: the name of the column by which the query result should be indexed. - [[asArray()]]: whether to return each record as an array. These options can be configured using methods of the same name. For example: ~~~ $articles = Article::find()->with('source')->asArray()->all(); ~~~ ActiveQuery allows to build the snippets using sources provided by ActiveRecord. You can use ActiveQuery::snippetByModel method to enable this. For example: ~~~ class Article extends ActiveRecord { public function getSource() { return $this->hasOne('db', ArticleDb::className(), ['id' => 'id']); } public function getSnippetSource() { return $this->source->content; } ... } $articles = Article::find()->with('source')->snippetByModel()->all(); ~~~ Relational query ---------------- In relational context ActiveQuery represents a relation between two Active Record classes. Relational ActiveQuery instances are usually created by calling [[ActiveRecord::hasOne()]] and [[ActiveRecord::hasMany()]]. An Active Record class declares a relation by defining a getter method which calls one of the above methods and returns the created ActiveQuery object. A relation is specified by [[link]] which represents the association between columns of different tables; and the multiplicity of the relation is indicated by [[multiple]]. If a relation involves a junction table, it may be specified by [[via()]]. This methods may only be called in a relational context. Same is true for [[inverseOf()]], which marks a relation as inverse of another relation.
Since: 2.0
Author: Paul Klimov (klimov.paul@gmail.com)
Inheritance: extends Query, implements yii\db\ActiveQueryInterface, use trait yii\db\ActiveQueryTrait, use trait yii\db\ActiveRelationTrait
Exemple #1
0
 /**
  *
  * @param \frontend\modules\search\models\SearchForm $model
  * @return \yii\data\ArrayDataProvider
  */
 public static function getTorrentDataProvider(SearchForm $model)
 {
     $query = new ActiveQuery('\\frontend\\modules\\torrent\\models\\Torrent');
     $query->from(static::indexName());
     $query->with('scrapes');
     // Keywords
     $searchPattern = '';
     if (!empty($model->words)) {
         if (is_array($model->words)) {
             $wordQuery = $model->words;
             foreach ($wordQuery as $key => $word) {
                 $wordQuery[$key] = Yii::$app->sphinx->escapeMatchValue($word);
             }
             $exact = '"' . implode(' ', $wordQuery) . '"';
             $approximite = $exact . '/5';
             usort($wordQuery, function ($a, $b) {
                 $a = mb_strlen($a, 'utf-8');
                 $b = mb_strlen($b, 'utf-8');
                 if ($a === $b) {
                     return 0;
                 }
                 return $a > $b ? -1 : 1;
             });
             $tmp = array();
             $tmp[] = $exact;
             foreach ($wordQuery as $word) {
                 if (mb_strlen($word, 'utf-8') > 3) {
                     $tmp[] = $word;
                 }
             }
             $tmp[] = $approximite;
             $search = join(' | ', $tmp);
         } else {
             $search = Yii::$app->sphinx->escapeMatchValue($model->words);
         }
         $searchPattern .= '@name ' . $search;
         $query->addOptions(['ranker' => new Expression('expr(\'' . 'sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25 + ' . '(created_at - 1000000000) / (NOW() - 1000000000) * 100 + if(torrent_status=1,100,0)\')')]);
     }
     // Tag
     if (!empty($model->tags)) {
         $searchPattern .= ' @tags "=' . $model->tags . '"';
     }
     // Sortable
     $isSortable = \Yii::$app->request->get('sort');
     if (empty($isSortable)) {
         $query->addOrderBy(['weight()' => SORT_DESC, 'id' => SORT_DESC]);
     }
     if (!empty($searchPattern)) {
         $query->match(new Expression(':match', [':match' => $searchPattern]));
     }
     // Filter torrents by age
     if (!empty($model->age)) {
         $query->where("created_at >= " . (time() - $model->age * 86400));
     }
     $query->andWhere(['deleted' => 0]);
     $query->addOptions(['max_matches' => 10000]);
     return new SphinxActiveDataProvider(['query' => $query, 'sort' => ['attributes' => ['seeders', 'leechers']], 'db' => Yii::$app->sphinx, 'sort' => ['attributes' => ['name' => ['default' => SORT_DESC], 'created_at' => ['default' => SORT_DESC], 'size' => ['default' => SORT_DESC], 'seeders' => ['default' => SORT_DESC], 'leechers' => ['default' => SORT_DESC]]], 'pagination' => ['pageSize' => 35]]);
 }
Exemple #2
0
 /**
  * @inheritdoc
  * @return ActiveQuery the newly created [[ActiveQuery]] instance.
  */
 public static function find()
 {
     return Yii::createObject(ActiveQuery::className(), [get_called_class()]);
 }