Skip to content

Commit 7445ea6

Browse files
authored
Merge pull request #1423 from milanspv/fix/delete-nested-embeds
[Fix] Unable to delete nested embedded models
2 parents 17b6864 + cada2cd commit 7445ea6

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

src/Jenssegers/Mongodb/Relations/EmbedsMany.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use Illuminate\Database\Eloquent\Model;
77
use Illuminate\Pagination\LengthAwarePaginator;
88
use Illuminate\Pagination\Paginator;
9-
use Illuminate\Support\Arr;
109
use MongoDB\BSON\ObjectID;
1110

1211
class EmbedsMany extends EmbedsOneOrMany
@@ -79,8 +78,7 @@ public function performUpdate(Model $model)
7978
// Get the correct foreign key value.
8079
$foreignKey = $this->getForeignKeyValue($model);
8180

82-
// Use array dot notation for better update behavior.
83-
$values = Arr::dot($model->getDirty(), $this->localKey . '.$.');
81+
$values = $this->getUpdateValues($model->getDirty(), $this->localKey . '.$.');
8482

8583
// Update document in database.
8684
$result = $this->getBaseQuery()->where($this->localKey . '.' . $model->getKeyName(), $foreignKey)

src/Jenssegers/Mongodb/Relations/EmbedsOne.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Jenssegers\Mongodb\Relations;
44

55
use Illuminate\Database\Eloquent\Model;
6-
use Illuminate\Support\Arr;
76
use MongoDB\BSON\ObjectID;
87

98
class EmbedsOne extends EmbedsOneOrMany
@@ -71,8 +70,7 @@ public function performUpdate(Model $model)
7170
return $this->parent->save();
7271
}
7372

74-
// Use array dot notation for better update behavior.
75-
$values = Arr::dot($model->getDirty(), $this->localKey . '.');
73+
$values = $this->getUpdateValues($model->getDirty(), $this->localKey . '.');
7674

7775
$result = $this->getBaseQuery()->update($values);
7876

src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,4 +375,22 @@ protected function getParentKey()
375375
{
376376
return $this->parent->getKey();
377377
}
378+
379+
/**
380+
* Return update values
381+
*
382+
* @param $array
383+
* @param string $prepend
384+
* @return array
385+
*/
386+
public static function getUpdateValues($array, $prepend = '')
387+
{
388+
$results = [];
389+
390+
foreach ($array as $key => $value) {
391+
$results[$prepend.$key] = $value;
392+
}
393+
394+
return $results;
395+
}
378396
}

tests/EmbeddedRelationsTest.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,56 @@ public function testNestedMixedEmbeds()
653653
$this->assertEquals('Steve Doe', $user->father->name);
654654
}
655655

656+
public function testNestedEmbedsOneDelete()
657+
{
658+
$user = User::create(['name' => 'John Doe']);
659+
$father = $user->father()->create(['name' => 'Mark Doe']);
660+
$grandfather = $father->father()->create(['name' => 'Steve Doe']);
661+
$greatgrandfather = $grandfather->father()->create(['name' => 'Tom Doe']);
662+
663+
$grandfather->delete();
664+
665+
$this->assertNull($user->father->father);
666+
667+
$user = User::where(['name' => 'John Doe'])->first();
668+
$this->assertNull($user->father->father);
669+
}
670+
671+
public function testNestedEmbedsManyDelete()
672+
{
673+
$user = User::create(['name' => 'John Doe']);
674+
$country = $user->addresses()->create(['country' => 'France']);
675+
$city1 = $country->addresses()->create(['city' => 'Paris']);
676+
$city2 = $country->addresses()->create(['city' => 'Nice']);
677+
$city3 = $country->addresses()->create(['city' => 'Lyon']);
678+
679+
$city2->delete();
680+
681+
$this->assertEquals(2, $user->addresses()->first()->addresses()->count());
682+
$this->assertEquals('Lyon', $country->addresses()->last()->city);
683+
684+
$user = User::where('name', 'John Doe')->first();
685+
$this->assertEquals(2, $user->addresses()->first()->addresses()->count());
686+
$this->assertEquals('Lyon', $country->addresses()->last()->city);
687+
}
688+
689+
public function testNestedMixedEmbedsDelete()
690+
{
691+
$user = User::create(['name' => 'John Doe']);
692+
$father = $user->father()->create(['name' => 'Mark Doe']);
693+
$country1 = $father->addresses()->create(['country' => 'France']);
694+
$country2 = $father->addresses()->create(['country' => 'Belgium']);
695+
696+
$country1->delete();
697+
698+
$this->assertEquals(1, $user->father->addresses()->count());
699+
$this->assertEquals('Belgium', $user->father->addresses()->last()->country);
700+
701+
$user = User::where('name', 'John Doe')->first();
702+
$this->assertEquals(1, $user->father->addresses()->count());
703+
$this->assertEquals('Belgium', $user->father->addresses()->last()->country);
704+
}
705+
656706
public function testDoubleAssociate()
657707
{
658708
$user = User::create(['name' => 'John Doe']);

0 commit comments

Comments
 (0)