public function __set($name, $value) { if (is_array($value) && count($value) > 0 && !$value[0] instanceof Object || !is_array($value) && !$value instanceof Object) { $getter = 'get' . $name; /** @var ActiveQuery $query */ $query = $this->owner->{$getter}(); /* @var $modelClass ActiveRecord */ $modelClass = $query->modelClass; $value = $modelClass::findAll($value); } $this->owner->populateRelation($name, $value); }
public function __set($name, $value) { if (is_array($value) && count($value) > 0 && !$value[0] instanceof Object || !is_array($value) && !$value instanceof Object) { $getter = 'get' . $name; /** @var ActiveQuery $activeQuery */ $activeQuery = $this->owner->{$getter}(); /* @var $modelClass ActiveRecord */ $modelClass = $activeQuery->modelClass; $value = $modelClass::findAll($value); if (!empty($activeQuery->via)) { list($junctionTable, $primaryModelColumn, $relatedModelColumn) = $this->parseQuery($activeQuery); $query = new Query(['select' => [$relatedModelColumn], 'from' => [$junctionTable], 'where' => [$primaryModelColumn => $this->owner->primaryKey]]); $this->oldRelations[$name] = $query->createCommand()->queryColumn(); } } $this->owner->populateRelation($name, $value); }
/** * @param array $files */ protected function saveFilesToRelation($files) { $modelClass = $this->getUploadModelClass(); $models = []; foreach ($files as $name => $file) { $model = new $modelClass(); $model->setScenario($this->uploadModelScenario); $model = $this->loadModel($model, $file); if ($this->getUploadRelation()->via !== null) { $model->save(false); } $models[$name] = $model; } $this->owner->populateRelation($this->uploadRelation, $models); }
/** * @inheritdoc */ public function load($data) { $this->_model = $this->getMeta(); $this->owner->populateRelation('metaRelation', $this->_model); return $this->_model->load($data); }
/** * @inheritdoc */ public function populateRelation($name, $value) { /** @var Model $related */ /** @var Model $relatedRecord */ $relation = $this->getRelation($name); $relatedRecordClass = $relation->modelClass; if ($relation->multiple) { $relatedRecords = array(); $this->_oldRelated[$name] = $this->{$name}; foreach ($value as $recordData) { $related = null; if (isset($recordData['id'])) { $related = $relatedRecordClass::findOne($recordData['id']); } if (!$related or !$related instanceof Model) { $related = new $relatedRecordClass(); } $related->load($recordData, ''); $relatedRecords[] = $related; } parent::populateRelation($name, $relatedRecords); /** * @param Model $oldRelatedRecord * @param integer $key * @param Model $args */ $deleteIfNotExitsInNewRelatedList = function ($oldRelatedRecord, $key, $args) { $exists = false; $relatedRecords = $args[0]; /** @var ActiveQuery $relation */ $relation = $args[1]; foreach ($relatedRecords as $relatedRecord) { if ($relatedRecord->isNewRecord) { continue; } if ($oldRelatedRecord->equals($relatedRecord)) { $exists = true; } } if ($relation->via instanceof ActiveQueryInterface) { $id = array_keys($relation->via->link); $id = reset($id); $viaTable = reset($relation->via->from); static::getDb()->createCommand()->delete($viaTable, [$id => $this->id])->execute(); } elseif (!$exists) { //old related record doesn't exists in the updated list so it has to be deleted $oldRelatedRecord->delete(); } }; $args = [$relatedRecords, $relation]; array_walk($this->_oldRelated[$name], $deleteIfNotExitsInNewRelatedList, $args); } else { $relatedRecord = new $relatedRecordClass(); if (isset($value['id'])) { $relatedRecord = $relatedRecordClass::findOne($value['id']); } if (!$relatedRecord or !$relatedRecord instanceof Model) { $relatedRecord = new $relatedRecordClass(); } $relatedRecord->load($value, ''); parent::populateRelation($name, $relatedRecord); } }