diff --git a/src/Jenssegers/Mongodb/Relations/EmbedsMany.php b/src/Jenssegers/Mongodb/Relations/EmbedsMany.php index f566e921c..b0e40893d 100644 --- a/src/Jenssegers/Mongodb/Relations/EmbedsMany.php +++ b/src/Jenssegers/Mongodb/Relations/EmbedsMany.php @@ -6,7 +6,6 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; -use Illuminate\Support\Arr; use MongoDB\BSON\ObjectID; class EmbedsMany extends EmbedsOneOrMany @@ -79,8 +78,7 @@ public function performUpdate(Model $model) // Get the correct foreign key value. $foreignKey = $this->getForeignKeyValue($model); - // Use array dot notation for better update behavior. - $values = Arr::dot($model->getDirty(), $this->localKey . '.$.'); + $values = $this->getUpdateValues($model->getDirty(), $this->localKey . '.$.'); // Update document in database. $result = $this->getBaseQuery()->where($this->localKey . '.' . $model->getKeyName(), $foreignKey) diff --git a/src/Jenssegers/Mongodb/Relations/EmbedsOne.php b/src/Jenssegers/Mongodb/Relations/EmbedsOne.php index f7932467a..2efbfe1df 100644 --- a/src/Jenssegers/Mongodb/Relations/EmbedsOne.php +++ b/src/Jenssegers/Mongodb/Relations/EmbedsOne.php @@ -3,7 +3,6 @@ namespace Jenssegers\Mongodb\Relations; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Arr; use MongoDB\BSON\ObjectID; class EmbedsOne extends EmbedsOneOrMany @@ -71,8 +70,7 @@ public function performUpdate(Model $model) return $this->parent->save(); } - // Use array dot notation for better update behavior. - $values = Arr::dot($model->getDirty(), $this->localKey . '.'); + $values = $this->getUpdateValues($model->getDirty(), $this->localKey . '.'); $result = $this->getBaseQuery()->update($values); diff --git a/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php b/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php index 031548743..35e14197d 100644 --- a/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php +++ b/src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php @@ -375,4 +375,22 @@ protected function getParentKey() { return $this->parent->getKey(); } + + /** + * Return update values + * + * @param $array + * @param string $prepend + * @return array + */ + public static function getUpdateValues($array, $prepend = '') + { + $results = []; + + foreach ($array as $key => $value) { + $results[$prepend.$key] = $value; + } + + return $results; + } } diff --git a/tests/EmbeddedRelationsTest.php b/tests/EmbeddedRelationsTest.php index 13da511eb..d602b0a71 100644 --- a/tests/EmbeddedRelationsTest.php +++ b/tests/EmbeddedRelationsTest.php @@ -653,6 +653,56 @@ public function testNestedMixedEmbeds() $this->assertEquals('Steve Doe', $user->father->name); } + public function testNestedEmbedsOneDelete() + { + $user = User::create(['name' => 'John Doe']); + $father = $user->father()->create(['name' => 'Mark Doe']); + $grandfather = $father->father()->create(['name' => 'Steve Doe']); + $greatgrandfather = $grandfather->father()->create(['name' => 'Tom Doe']); + + $grandfather->delete(); + + $this->assertNull($user->father->father); + + $user = User::where(['name' => 'John Doe'])->first(); + $this->assertNull($user->father->father); + } + + public function testNestedEmbedsManyDelete() + { + $user = User::create(['name' => 'John Doe']); + $country = $user->addresses()->create(['country' => 'France']); + $city1 = $country->addresses()->create(['city' => 'Paris']); + $city2 = $country->addresses()->create(['city' => 'Nice']); + $city3 = $country->addresses()->create(['city' => 'Lyon']); + + $city2->delete(); + + $this->assertEquals(2, $user->addresses()->first()->addresses()->count()); + $this->assertEquals('Lyon', $country->addresses()->last()->city); + + $user = User::where('name', 'John Doe')->first(); + $this->assertEquals(2, $user->addresses()->first()->addresses()->count()); + $this->assertEquals('Lyon', $country->addresses()->last()->city); + } + + public function testNestedMixedEmbedsDelete() + { + $user = User::create(['name' => 'John Doe']); + $father = $user->father()->create(['name' => 'Mark Doe']); + $country1 = $father->addresses()->create(['country' => 'France']); + $country2 = $father->addresses()->create(['country' => 'Belgium']); + + $country1->delete(); + + $this->assertEquals(1, $user->father->addresses()->count()); + $this->assertEquals('Belgium', $user->father->addresses()->last()->country); + + $user = User::where('name', 'John Doe')->first(); + $this->assertEquals(1, $user->father->addresses()->count()); + $this->assertEquals('Belgium', $user->father->addresses()->last()->country); + } + public function testDoubleAssociate() { $user = User::create(['name' => 'John Doe']);