The properties being copies are the ones to be used by query builders.
public static create ( |
||
$from | the source query object | |
return | the new Query object |
/** * @inheritdoc */ public function prepare($builder) { // NOTE: because the same ActiveQuery may be used to build different SQL statements // (e.g. by ActiveDataProvider, one for count query, the other for row data query, // it is important to make sure the same ActiveQuery can be used to build SQL statements // multiple times. if (!empty($this->joinWith)) { $this->buildJoinWith(); $this->joinWith = null; // clean it up to avoid issue https://github.com/yiisoft/yii2/issues/2687 } if (empty($this->from)) { /* @var $modelClass ActiveRecord */ $modelClass = $this->modelClass; $tableName = $modelClass::tableName(); $this->from = [$tableName]; } if (empty($this->select) && !empty($this->join)) { list(, $alias) = $this->getQueryTableName($this); $this->select = ["{$alias}.*"]; } if ($this->primaryModel === null) { // eager loading $query = Query::create($this); } else { // lazy loading of a relation $where = $this->where; if ($this->via instanceof self) { // via junction table $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]); } $this->_viaModels = !empty($viaModels) ? $viaModels : []; $query = Query::create($this); $this->where = $where; } if (!empty($this->on)) { $query->andWhere($this->on); } return $query; }
public function relations($model, $attribute) { $relation = $model->fileRelation($attribute); $handlerRelationQuery = $model->fileOption($attribute, 'relationQuery'); $query = null; if ($handlerRelationQuery) { $query = Query::create($handlerRelationQuery($model->find())); } $query = $query ?: new Query(); return $query->from($relation->via->from[0])->andWhere([key($relation->via->link) => $model->getPrimaryKey()])->indexBy(current($relation->link))->all(); }