diff --git a/src/SaveRelationsBehavior.php b/src/SaveRelationsBehavior.php index 370f25e..d1ea552 100644 --- a/src/SaveRelationsBehavior.php +++ b/src/SaveRelationsBehavior.php @@ -228,7 +228,7 @@ class SaveRelationsBehavior extends Behavior public function _saveModelRecord(ActiveRecord $model, ModelEvent $event, $pettyRelationName, $relationName) { $this->_validateRelationModel($pettyRelationName, $relationName, $model, $event); - if ($event->isValid && count($model->dirtyAttributes)) { + if ($event->isValid && (count($model->dirtyAttributes) || $model->isNewRecord)) { Yii::trace("Saving {$pettyRelationName} relation model", __METHOD__); $model->save(false); } @@ -241,12 +241,7 @@ class SaveRelationsBehavior extends Behavior * @param ActiveRecord $relationModel * @param ModelEvent $event */ - private function _validateRelationModel( - $pettyRelationName, - $relationName, - ActiveRecord $relationModel, - ModelEvent $event - ) + private function _validateRelationModel($pettyRelationName, $relationName, ActiveRecord $relationModel, ModelEvent $event) { /** @var ActiveRecord $model */ $model = $this->owner; @@ -312,7 +307,7 @@ class SaveRelationsBehavior extends Behavior $model->link($relationName, $actualModels[$key]); } } else { // Has one relation - if ($this->_oldRelationValue[$relationName] != $model->{$relationName}) { + if ($this->_oldRelationValue[$relationName] !== $model->{$relationName}) { if ($model->{$relationName} instanceof ActiveRecord) { $model->link($relationName, $model->{$relationName}); } else { diff --git a/tests/SaveRelationsBehaviorTest.php b/tests/SaveRelationsBehaviorTest.php index 84e661f..4f606e4 100644 --- a/tests/SaveRelationsBehaviorTest.php +++ b/tests/SaveRelationsBehaviorTest.php @@ -6,8 +6,11 @@ namespace tests; use lhs\Yii2SaveRelationsBehavior\SaveRelationsBehavior; use RuntimeException; use tests\models\Company; +use tests\models\DummyModel; +use tests\models\DummyModelParent; use tests\models\Link; use tests\models\Project; +use tests\models\ProjectLink; use tests\models\ProjectNoTransactions; use tests\models\User; use Yii; @@ -33,6 +36,7 @@ class SaveRelationsBehaviorTest extends \PHPUnit_Framework_TestCase $db->createCommand()->dropTable('link_type')->execute(); $db->createCommand()->dropTable('link')->execute(); $db->createCommand()->dropTable('project_link')->execute(); + $db->createCommand()->dropTable('dummy')->execute(); parent::tearDown(); } @@ -94,6 +98,12 @@ class SaveRelationsBehaviorTest extends \PHPUnit_Framework_TestCase 'PRIMARY KEY(project_id, user_id)' ])->execute(); + // Dummy + $db->createCommand()->createTable('dummy', [ + 'id' => $migration->primaryKey(), + 'parent_id' => $migration->integer() + ])->execute(); + /** * Insert some data */ @@ -136,7 +146,6 @@ class SaveRelationsBehaviorTest extends \PHPUnit_Framework_TestCase [1, 4], [2, 2] ])->execute(); - } /** @@ -427,4 +436,20 @@ class SaveRelationsBehaviorTest extends \PHPUnit_Framework_TestCase $this->assertEquals(1, count($project->users), 'Project should have 1 users after assignment'); } + public function testChangeHasOneRelationWithAnotherObject() + { + $dummy_a = new DummyModel(); + $dummy_b = new DummyModel(); + $dummy_a->save(); + $dummy_b->save(); + $dummy_a->children = $dummy_b; + $dummy_b->children = $dummy_a; + $this->assertTrue($dummy_a->save(), 'Dummy A could not be saved'); + $this->assertTrue($dummy_b->save(), 'Dummy B could not be saved'); + $dummy_c = new DummyModel(); + //$this->assertTrue($dummy_c->save(), 'Dummy C could not be saved'); + $dummy_a->children = $dummy_c; + $this->assertTrue($dummy_a->save(), 'Dummy A could not be saved'); + } + } diff --git a/tests/models/DummyModel.php b/tests/models/DummyModel.php new file mode 100644 index 0000000..3e6e134 --- /dev/null +++ b/tests/models/DummyModel.php @@ -0,0 +1,48 @@ + [ + 'class' => SaveRelationsBehavior::className(), + 'relations' => ['children'] + ], + ]; + } + + /** + * @return \yii\db\ActiveQuery + */ + public function getChildren() + { + return $this->hasOne(DummyModel::className(), ['id' => 'parent_id']); + } + +} \ No newline at end of file