From 9e7866aefcbb27681f61a65ca0fe1c10643da424 Mon Sep 17 00:00:00 2001 From: Hamid Date: Thu, 29 Nov 2018 16:49:16 +0330 Subject: [PATCH] use mongodb driver to check for dirtiness --- src/Jenssegers/Mongodb/Eloquent/Model.php | 19 ++++------- tests/ModelTest.php | 41 ++++++++++++++++++++++- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/Jenssegers/Mongodb/Eloquent/Model.php b/src/Jenssegers/Mongodb/Eloquent/Model.php index aafe49904..1658ced70 100644 --- a/src/Jenssegers/Mongodb/Eloquent/Model.php +++ b/src/Jenssegers/Mongodb/Eloquent/Model.php @@ -14,6 +14,8 @@ use MongoDB\BSON\Binary; use MongoDB\BSON\ObjectID; use MongoDB\BSON\UTCDateTime; +use function MongoDB\BSON\fromPHP; +use MongoDB\Driver\Exception\UnexpectedValueException; abstract class Model extends BaseModel { @@ -239,20 +241,11 @@ public function originalIsEquivalent($key, $current) return false; } - if ($this->isDateAttribute($key)) { - $current = $current instanceof UTCDateTime ? $this->asDateTime($current) : $current; - $original = $original instanceof UTCDateTime ? $this->asDateTime($original) : $original; - - return $current == $original; - } - - if ($this->hasCast($key)) { - return $this->castAttribute($key, $current) === - $this->castAttribute($key, $original); + try { + return fromPHP([$current]) === fromPHP([$original]); + } catch (UnexpectedValueException $e) { + return false; } - - return is_numeric($current) && is_numeric($original) - && strcmp((string) $current, (string) $original) === 0; } /** diff --git a/tests/ModelTest.php b/tests/ModelTest.php index c374ea828..39ccdd929 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -555,13 +555,52 @@ public function testMultipleLevelDotNotation(): void public function testGetDirtyDates(): void { $user = new User(); - $user->setRawAttributes(['name' => 'John Doe', 'birthday' => new DateTime('19 august 1989')], true); + $user->name = 'John Doe'; + $user->birthday = new DateTime('19 august 1989'); + $user->syncOriginal(); $this->assertEmpty($user->getDirty()); $user->birthday = new DateTime('19 august 1989'); $this->assertEmpty($user->getDirty()); } + public function testGetDirty(): void + { + $ids = [ + new ObjectId(), + new ObjectId(), + ]; + $item = new Item([ + 'numbers' => [1, 2, 3], + 'number' => 4, + 'ids' => $ids, + 'nullable' => 'value', + 'fix' => 'fix', + ]); + $item->date = $item->fromDateTime(new DateTime('19 august 1989')); + $item->dates = [$item->fromDateTime(new DateTime('19 august 1989'))]; + $item->save(); + + $item = $item->fresh(); + + $item->numbers = [1, 2, '3']; + $item->nullable = null; + $item->new_val = 'new'; + $item->number = '4'; + $item->ids = [ + new ObjectId((string) $ids[0]), + new ObjectId((string) $ids[1]), + ]; + $item->date = $item->fromDateTime(new DateTime('19 august 1989')); + $item->dates = [$item->fromDateTime(new DateTime('19 august 1989'))]; + $this->assertEquals([ + 'numbers' => [1, 2, '3'], + 'number' => '4', + 'nullable' => null, + 'new_val' => 'new', + ], $item->getDirty()); + } + public function testChunkById(): void { User::create(['name' => 'fork', 'tags' => ['sharp', 'pointy']]);