Exemple #1
33
 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);
 }
Exemple #4
0
 /**
  * @inheritdoc
  */
 public function load($data)
 {
     $this->_model = $this->getMeta();
     $this->owner->populateRelation('metaRelation', $this->_model);
     return $this->_model->load($data);
 }
Exemple #5
0
 /**
  * @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);
     }
 }