Skip to content

Commit 8b5ab59

Browse files
Fixes: getting immutable_datetime property fails if Date::use(CarbonImmutable::class) is set (#3342)
1 parent 1be4cef commit 8b5ab59

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

src/Eloquent/DocumentModel.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace MongoDB\Laravel\Eloquent;
66

77
use BackedEnum;
8-
use Carbon\Carbon;
98
use Carbon\CarbonInterface;
109
use DateTimeInterface;
1110
use DateTimeZone;
@@ -128,7 +127,7 @@ public function fromDateTime($value): UTCDateTime
128127
*
129128
* @param mixed $value
130129
*/
131-
protected function asDateTime($value): Carbon
130+
protected function asDateTime($value): DateTimeInterface
132131
{
133132
// Convert UTCDateTime instances to Carbon.
134133
if ($value instanceof UTCDateTime) {

tests/DateTimeImmutableTest.php

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MongoDB\Laravel\Tests\Eloquent;
6+
7+
use Carbon\CarbonImmutable;
8+
use Illuminate\Support\Facades\Date;
9+
use MongoDB\Laravel\Tests\Models\Anniversary;
10+
use MongoDB\Laravel\Tests\TestCase;
11+
12+
use function assert;
13+
14+
final class DateTimeImmutableTest extends TestCase
15+
{
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
Anniversary::truncate();
21+
}
22+
23+
protected function tearDown(): void
24+
{
25+
Date::useDefault();
26+
27+
parent::tearDown();
28+
}
29+
30+
public function testCanReturnCarbonImmutableObject(): void
31+
{
32+
Date::use(CarbonImmutable::class);
33+
34+
Anniversary::create([
35+
'name' => 'John',
36+
'anniversary' => new CarbonImmutable('2020-01-01 00:00:00'),
37+
]);
38+
39+
$anniversary = Anniversary::sole();
40+
assert($anniversary instanceof Anniversary);
41+
self::assertInstanceOf(CarbonImmutable::class, $anniversary->anniversary);
42+
}
43+
}

tests/Models/Anniversary.php

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MongoDB\Laravel\Tests\Models;
6+
7+
use Illuminate\Database\Eloquent\Model;
8+
use MongoDB\Laravel\Eloquent\DocumentModel;
9+
use MongoDB\Laravel\Eloquent\Model as Eloquent;
10+
use MongoDB\Laravel\Query\Builder;
11+
12+
/**
13+
* @property string $name
14+
* @property string $anniversary
15+
* @mixin Eloquent
16+
* @method static Builder create(...$values)
17+
* @method static Builder truncate()
18+
* @method static Eloquent sole(...$parameters)
19+
*/
20+
class Anniversary extends Model
21+
{
22+
use DocumentModel;
23+
24+
protected $keyType = 'string';
25+
protected $connection = 'mongodb';
26+
protected $table = 'anniversary';
27+
protected $fillable = ['name', 'anniversary'];
28+
29+
protected $casts = ['anniversary' => 'immutable_datetime'];
30+
}

0 commit comments

Comments
 (0)