Skip to content
This repository has been archived by the owner on Jul 1, 2022. It is now read-only.

Commit

Permalink
Merge 297b3c1 into 79deb94
Browse files Browse the repository at this point in the history
  • Loading branch information
papppeter committed Sep 13, 2019
2 parents 79deb94 + 297b3c1 commit 7499a07
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 13 deletions.
46 changes: 34 additions & 12 deletions src/SaveRelationsBehavior.php
Expand Up @@ -9,6 +9,7 @@
use yii\base\Exception;
use yii\base\InvalidArgumentException;
use yii\base\InvalidConfigException;
use yii\base\Model;
use yii\base\ModelEvent;
use yii\base\UnknownPropertyException;
use yii\db\ActiveQuery;
Expand Down Expand Up @@ -162,8 +163,15 @@ protected function setSingleRelation($relationName, $value)
$owner = $this->owner;
/** @var ActiveQuery $relation */
$relation = $owner->getRelation($relationName);

if (!($value instanceof $relation->modelClass)) {
$value = $this->processModelAsArray($value, $relation, $relationName);
//we have an existing hasone relation model
if(is_array($value) && $this->_getRelatedFks($value, $relation, $relation->modelClass) && $owner->{$relationName} instanceof $relation->modelClass && !$owner->{$relationName}->getIsNewRecord()) {
$this->_loadRelationModel($value, $relationName, $owner->{$relationName});
$value = $owner->{$relationName};
} else {
$value = $this->processModelAsArray($value, $relation, $relationName);
}
}
$this->_newRelationValue[$relationName] = $value;
$owner->populateRelation($relationName, $value);
Expand Down Expand Up @@ -283,17 +291,7 @@ private function _loadOrCreateRelationModel($data, $fks, $modelClass, $relationN
if (!($relationModel instanceof BaseActiveRecord) && !empty($data)) {
$relationModel = new $modelClass;
}
// If a custom scenario is set, apply it here to correctly be able to set the model attributes
if (array_key_exists($relationName, $this->_relationsScenario)) {
$relationModel->setScenario($this->_relationsScenario[$relationName]);
}
if (($relationModel instanceof BaseActiveRecord) && is_array($data)) {
$relationModel->setAttributes($data);
if ($relationModel->hasMethod('loadRelations')) {
$relationModel->loadRelations($data);
}

}
$this->_loadRelationModel($data, $relationName, $relationModel);
return $relationModel;
}

Expand Down Expand Up @@ -833,4 +831,28 @@ public function markRelationDirty($relationName)
}
return false;
}

/**
* @param $data
* @param $relationName
* @param $relationModel
*/
private function _loadRelationModel($data, $relationName, ?Model $relationModel): void
{
if($relationModel === null) {
return;
}

// If a custom scenario is set, apply it here to correctly be able to set the model attributes
if (array_key_exists($relationName, $this->_relationsScenario)) {
$relationModel->setScenario($this->_relationsScenario[$relationName]);
}
if (($relationModel instanceof BaseActiveRecord) && is_array($data)) {
$relationModel->setAttributes($data);
if ($relationModel->hasMethod('loadRelations')) {
$relationModel->loadRelations($data);
}

}
}
}
44 changes: 43 additions & 1 deletion src/SaveRelationsTrait.php
Expand Up @@ -2,15 +2,57 @@

namespace lhs\Yii2SaveRelationsBehavior;

/**
* Trait SaveRelationsTrait
* @package lhs\Yii2SaveRelationsBehavior
*
* @mixin SaveRelationsBehavior
*/
trait SaveRelationsTrait
{

public function load($data, $formName = null)
{
$loaded = parent::load($data, $formName);
if ($loaded && $this->hasMethod('loadRelations')) {
$this->_prepareLoadData($data);

$this->loadRelations($data);
}
return $loaded;
}
}

/**
* @param $data
*/
private function _prepareLoadData(&$data) {
$scope = $formName === null ? $this->formName() : $formName;

foreach ($this->relations as $key => $value) {
if (is_int($key)) {
$relationName = $value;
} else {
$relationName = $key;
}

if(!isset($data[$scope][$relationName])) {
continue;
}

$relation = $this->getRelation($relationName);

if(!$relation) {
continue;
}

$modelClass = $relation->modelClass;
/** @var ActiveQuery $relationalModel */
$relationalModel = new $modelClass;
$keyName = $relationalModel->formName();

$data[$keyName] = $data[$scope][$relationName];

unset($data[$scope][$relationName]);
}
}
}

0 comments on commit 7499a07

Please sign in to comment.