Skip to content

Commit 996d7a9

Browse files
committed
PHPORM-211 Fix unsetting property in embedded model
1 parent a62d4b9 commit 996d7a9

File tree

2 files changed

+39
-14
lines changed

2 files changed

+39
-14
lines changed

src/Relations/EmbedsOneOrMany.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Throwable;
1616

1717
use function array_merge;
18+
use function assert;
1819
use function count;
1920
use function is_array;
2021
use function throw_if;
@@ -392,7 +393,12 @@ public static function getUpdateValues($array, $prepend = '')
392393
$results = [];
393394

394395
foreach ($array as $key => $value) {
395-
$results[$prepend . $key] = $value;
396+
if ($key === '$unset') {
397+
assert(is_array($value), '$unset must be an array.');
398+
$results[$key] = static::getUpdateValues($value, $prepend);
399+
} else {
400+
$results[$prepend . $key] = $value;
401+
}
396402
}
397403

398404
return $results;

tests/EmbeddedRelationsTest.php

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@
1010
use Mockery;
1111
use MongoDB\BSON\ObjectId;
1212
use MongoDB\Laravel\Tests\Models\Address;
13-
use MongoDB\Laravel\Tests\Models\Book;
14-
use MongoDB\Laravel\Tests\Models\Client;
15-
use MongoDB\Laravel\Tests\Models\Group;
16-
use MongoDB\Laravel\Tests\Models\Item;
17-
use MongoDB\Laravel\Tests\Models\Photo;
18-
use MongoDB\Laravel\Tests\Models\Role;
1913
use MongoDB\Laravel\Tests\Models\User;
2014

2115
use function array_merge;
@@ -25,14 +19,7 @@ class EmbeddedRelationsTest extends TestCase
2519
public function tearDown(): void
2620
{
2721
Mockery::close();
28-
2922
User::truncate();
30-
Book::truncate();
31-
Item::truncate();
32-
Role::truncate();
33-
Client::truncate();
34-
Group::truncate();
35-
Photo::truncate();
3623
}
3724

3825
public function testEmbedsManySave()
@@ -951,4 +938,36 @@ public function testGetQueueableRelationsEmbedsOne()
951938
$this->assertEquals(['father'], $user->getQueueableRelations());
952939
$this->assertEquals([], $user->father->getQueueableRelations());
953940
}
941+
942+
public function testUnsetPropertyOnEmbed()
943+
{
944+
$user = User::create(['name' => 'John Doe']);
945+
$user->addresses()->save(new Address(['city' => 'New York']));
946+
$user->addresses()->save(new Address(['city' => 'Tokyo']));
947+
948+
// Set property
949+
$user->addresses->first()->city = 'Paris';
950+
$user->addresses->first()->save();
951+
952+
$user = User::where('name', 'John Doe')->first();
953+
$this->assertSame('Paris', $user->addresses->get(0)->city);
954+
$this->assertSame('Tokyo', $user->addresses->get(1)->city);
955+
956+
// Unset property
957+
unset($user->addresses->first()->city);
958+
$user->addresses->first()->save();
959+
960+
$user = User::where('name', 'John Doe')->first();
961+
$this->assertSame(null, $user->addresses->get(0)->city);
962+
$this->assertSame('Tokyo', $user->addresses->get(1)->city);
963+
964+
// Unset and reset property
965+
unset($user->addresses->get(1)->city);
966+
$user->addresses->get(1)->city = 'Kyoto';
967+
$user->addresses->get(1)->save();
968+
969+
$user = User::where('name', 'John Doe')->first();
970+
$this->assertSame(null, $user->addresses->get(0)->city);
971+
$this->assertSame('Kyoto', $user->addresses->get(1)->city);
972+
}
954973
}

0 commit comments

Comments
 (0)