From 9c6653e43d374ca301e68c77a760cb9f62377b59 Mon Sep 17 00:00:00 2001 From: KyleKatarn Date: Wed, 23 Sep 2020 17:29:32 +0200 Subject: [PATCH 1/6] Allow modifiers in createFromFormat() --- .../Database/Eloquent/Concerns/HasAttributes.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index 498e87195adc..a4ec0952eda4 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -3,6 +3,7 @@ namespace Illuminate\Database\Eloquent\Concerns; use Carbon\CarbonInterface; +use Carbon\Exceptions\InvalidFormatException; use DateTimeInterface; use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes; @@ -912,11 +913,13 @@ protected function asDateTime($value) // Finally, we will just assume this date is in the format used by default on // the database connection and use that format to create the Carbon object // that is returned back out to the developers after we convert it here. - if (Date::hasFormat($value, $format)) { - return Date::createFromFormat($format, $value); + try { + $date = Date::createFromFormat($format, $value); + } catch (InvalidFormatException $_) { + $date = false; } - return Date::parse($value); + return $date ?: Date::parse($value); } /** From 94ad84680a190dc8a213a0a3947f4c3419bd06e2 Mon Sep 17 00:00:00 2001 From: KyleKatarn Date: Wed, 23 Sep 2020 22:32:53 +0200 Subject: [PATCH 2/6] Fix error catch to handle older Carbon versions --- src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index a4ec0952eda4..3e59501fd065 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -15,6 +15,7 @@ use Illuminate\Support\Collection as BaseCollection; use Illuminate\Support\Facades\Date; use Illuminate\Support\Str; +use InvalidArgumentException; use LogicException; trait HasAttributes @@ -915,7 +916,7 @@ protected function asDateTime($value) // that is returned back out to the developers after we convert it here. try { $date = Date::createFromFormat($format, $value); - } catch (InvalidFormatException $_) { + } catch (InvalidFormatException | InvalidArgumentException $_) { $date = false; } From 647d226715f9600e0e61f36f33e1465eff535524 Mon Sep 17 00:00:00 2001 From: KyleKatarn Date: Wed, 23 Sep 2020 23:43:34 +0200 Subject: [PATCH 3/6] Add test to show the handle of special formats --- .../DatabaseEloquentIntegrationTest.php | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/Database/DatabaseEloquentIntegrationTest.php b/tests/Database/DatabaseEloquentIntegrationTest.php index db36f33c6ccc..bf304590b83b 100644 --- a/tests/Database/DatabaseEloquentIntegrationTest.php +++ b/tests/Database/DatabaseEloquentIntegrationTest.php @@ -1413,6 +1413,34 @@ public function testTimestampsUsingOldSqlServerDateFormatFallbackToDefaultParsin $this->assertFalse(Date::hasFormat('2017-11-14 08:23:19.734', $model->getDateFormat())); } + public function testSpecialFormats() + { + $model = new EloquentTestUser; + $model->setDateFormat('!Y-d-m \\Y'); + $model->setRawAttributes([ + 'updated_at' => '2017-05-11 Y', + ]); + + $date = $model->getAttribute('updated_at'); + $this->assertSame('2017-11-05 00:00:00.000000', $date->format('Y-m-d H:i:s.u'), 'the date should respect the whole format'); + + $model->setDateFormat('Y d m|'); + $model->setRawAttributes([ + 'updated_at' => '2020 11 09', + ]); + + $date = $model->getAttribute('updated_at'); + $this->assertSame('2020-09-11 00:00:00.000000', $date->format('Y-m-d H:i:s.u'), 'the date should respect the whole format'); + + $model->setDateFormat('Y d m|*'); + $model->setRawAttributes([ + 'updated_at' => '2020 11 09 foo', + ]); + + $date = $model->getAttribute('updated_at'); + $this->assertSame('2020-09-11 00:00:00.000000', $date->format('Y-m-d H:i:s.u'), 'the date should respect the whole format'); + } + public function testUpdatingChildModelTouchesParent() { $before = Carbon::now(); From 56a0a254ab639d793ddec71c38bb4870744ce3f0 Mon Sep 17 00:00:00 2001 From: KyleKatarn Date: Thu, 24 Sep 2020 00:06:29 +0200 Subject: [PATCH 4/6] Use only root type in exception catch --- src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index 3e59501fd065..010bf9351ae5 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -916,7 +916,7 @@ protected function asDateTime($value) // that is returned back out to the developers after we convert it here. try { $date = Date::createFromFormat($format, $value); - } catch (InvalidFormatException | InvalidArgumentException $_) { + } catch (InvalidArgumentException $_) { $date = false; } From 3fbceab1836a8581393b67de88fbf95c640b18b3 Mon Sep 17 00:00:00 2001 From: KyleKatarn Date: Thu, 24 Sep 2020 00:16:26 +0200 Subject: [PATCH 5/6] Cleanup import --- src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index 010bf9351ae5..f036ef2835ea 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -3,7 +3,6 @@ namespace Illuminate\Database\Eloquent\Concerns; use Carbon\CarbonInterface; -use Carbon\Exceptions\InvalidFormatException; use DateTimeInterface; use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes; From b084985496bc4ea227d77e17d7105c3b317b0467 Mon Sep 17 00:00:00 2001 From: Kyle Date: Thu, 24 Sep 2020 13:26:40 +0200 Subject: [PATCH 6/6] Use letter abbreviation over undescore Co-authored-by: Dries Vints --- src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index f036ef2835ea..655f1018a504 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -915,7 +915,7 @@ protected function asDateTime($value) // that is returned back out to the developers after we convert it here. try { $date = Date::createFromFormat($format, $value); - } catch (InvalidArgumentException $_) { + } catch (InvalidArgumentException $e) { $date = false; }