From 4085d4d85486c0e0e36cf6d97ccc1d6a9ff0841e Mon Sep 17 00:00:00 2001 From: Alban Jubert Date: Mon, 27 Nov 2017 09:32:13 +0100 Subject: [PATCH] Fix for HasOne update issue --- src/SaveRelationsBehavior.php | 4 ++++ tests/SaveRelationsBehaviorTest.php | 44 ++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/SaveRelationsBehavior.php b/src/SaveRelationsBehavior.php index 0b8a476..f7c7dea 100644 --- a/src/SaveRelationsBehavior.php +++ b/src/SaveRelationsBehavior.php @@ -430,6 +430,10 @@ class SaveRelationsBehavior extends Behavior } } } + if ($model->{$relationName} instanceof BaseActiveRecord) { + $model->{$relationName}->save(); + } + } unset($this->_oldRelationValue[$relationName]); } diff --git a/tests/SaveRelationsBehaviorTest.php b/tests/SaveRelationsBehaviorTest.php index 6c45793..bb759ea 100644 --- a/tests/SaveRelationsBehaviorTest.php +++ b/tests/SaveRelationsBehaviorTest.php @@ -656,7 +656,7 @@ class SaveRelationsBehaviorTest extends \PHPUnit_Framework_TestCase $this->assertEquals($user->id, $user->userProfile->user_id); } - public function testSaveCompanyWithUser() + public function testSaveNestedModels() { $project = new Project(); $project->name = "Cartoon"; @@ -667,5 +667,47 @@ class SaveRelationsBehaviorTest extends \PHPUnit_Framework_TestCase $company->users = $user; $project->company = $company; $this->assertTrue($project->save(), 'Project could not be saved'); + $project->refresh(); + $this->assertEquals($project->name, "Cartoon"); + $this->assertEquals($project->company->name, "ACME"); + $this->assertEquals($project->company->users[0]->username, "Bugs Bunny"); + } + + public function testUpdateHasOneNestedModels() + { + $project = Project::findOne(1); + $project->name = "Other name"; + $company = $project->company; + $company->name = "Tutu"; + $users = $company->users; + $user = $users[0]; + $user->username = "Someone Else"; + $users[0] = $user; + $company->users = $users; + $project->company = $company; + $this->assertTrue($project->save(), 'Project could not be saved'); + $project->refresh(); + $this->assertEquals($project->name, "Other name"); + $this->assertEquals($project->company->name, "Tutu"); + $this->assertEquals($project->company->users[0]->username, "Someone Else"); + } + + public function testUpdateHasManyNestedModels() + { + $project = Project::findOne(1); + $project->name = "Other name"; + $users = $project->users; + $user = $users[0]; + $company = $user->company; + $company->name = "Tutu"; + $user->company = $company; + $users[0] = $user; + $user->username = "Someone Else"; + $project->users = $users; + $this->assertTrue($project->save(), 'Project could not be saved'); + $project->refresh(); + $this->assertEquals($project->name, "Other name"); + $this->assertEquals($project->company->name, "Tutu"); + $this->assertEquals($project->company->users[0]->username, "Someone Else"); } }