diff --git a/src/Jenssegers/Mongodb/Eloquent/Model.php b/src/Jenssegers/Mongodb/Eloquent/Model.php index 081659d73..37514b614 100644 --- a/src/Jenssegers/Mongodb/Eloquent/Model.php +++ b/src/Jenssegers/Mongodb/Eloquent/Model.php @@ -2,7 +2,7 @@ namespace Jenssegers\Mongodb\Eloquent; -use DateTime; +use DateTimeInterface; use Illuminate\Contracts\Queue\QueueableCollection; use Illuminate\Contracts\Queue\QueueableEntity; use Illuminate\Database\Eloquent\Model as BaseModel; @@ -85,7 +85,7 @@ public function fromDateTime($value) } // Let Eloquent convert the value to a DateTime instance. - if (!$value instanceof DateTime) { + if (!$value instanceof DateTimeInterface) { $value = parent::asDateTime($value); } diff --git a/src/Jenssegers/Mongodb/Query/Builder.php b/src/Jenssegers/Mongodb/Query/Builder.php index afe58e108..b611262cd 100644 --- a/src/Jenssegers/Mongodb/Query/Builder.php +++ b/src/Jenssegers/Mongodb/Query/Builder.php @@ -3,7 +3,7 @@ namespace Jenssegers\Mongodb\Query; use Closure; -use DateTime; +use DateTimeInterface; use Illuminate\Database\Query\Builder as BaseBuilder; use Illuminate\Database\Query\Expression; use Illuminate\Support\Arr; @@ -929,18 +929,18 @@ protected function compileWheres() if (isset($where['value'])) { if (is_array($where['value'])) { array_walk_recursive($where['value'], function (&$item, $key) { - if ($item instanceof DateTime) { + if ($item instanceof DateTimeInterface) { $item = new UTCDateTime($item->format('Uv')); } }); } else { - if ($where['value'] instanceof DateTime) { + if ($where['value'] instanceof DateTimeInterface) { $where['value'] = new UTCDateTime($where['value']->format('Uv')); } } } elseif (isset($where['values'])) { array_walk_recursive($where['values'], function (&$item, $key) { - if ($item instanceof DateTime) { + if ($item instanceof DateTimeInterface) { $item = new UTCDateTime($item->format('Uv')); } }); diff --git a/tests/ModelTest.php b/tests/ModelTest.php index 61f1df0ec..fa799ce0e 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -497,6 +497,9 @@ public function testDates(): void $user->setAttribute('birthday', new DateTime('1965-08-08 04.08.37.324')); $this->assertInstanceOf(Carbon::class, $user->birthday); + $user->setAttribute('birthday', new DateTimeImmutable('1965-08-08 04.08.37.324')); + $this->assertInstanceOf(Carbon::class, $user->birthday); + //Test with create and array property $user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => time()]]); $this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date')); diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index ed2bb100c..3697658e3 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -574,6 +574,33 @@ public function testDates() $this->assertCount(2, $users); } + public function testImmutableDates() + { + DB::collection('users')->insert([ + ['name' => 'John Doe', 'birthday' => new UTCDateTime(Date::parse("1980-01-01 00:00:00")->format('Uv'))], + ['name' => 'Robert Roe', 'birthday' => new UTCDateTime(Date::parse("1982-01-01 00:00:00")->format('Uv'))], + ]); + + $users = DB::collection('users')->where('birthday', '=', new DateTimeImmutable("1980-01-01 00:00:00"))->get(); + $this->assertCount(1, $users); + + $users = DB::collection('users')->where('birthday', new DateTimeImmutable("1980-01-01 00:00:00"))->get(); + $this->assertCount(1, $users); + + $users = DB::collection('users')->whereIn('birthday', [ + new DateTimeImmutable("1980-01-01 00:00:00"), + new DateTimeImmutable("1982-01-01 00:00:00") + ])->get(); + $this->assertCount(2, $users); + + $users = DB::collection('users')->whereBetween('birthday', [ + new DateTimeImmutable("1979-01-01 00:00:00"), + new DateTimeImmutable("1983-01-01 00:00:00") + ])->get(); + + $this->assertCount(2, $users); + } + public function testOperators() { DB::collection('users')->insert([