From 173d00fa75f9740621c3bd5b488c01caf7380be6 Mon Sep 17 00:00:00 2001 From: Pandi Selvam Date: Wed, 12 Feb 2025 18:26:58 +0530 Subject: [PATCH 1/3] Fix: Inconsistent accessor attribute name conversion #54570 --- .../Eloquent/Concerns/HasAttributes.php | 3 +- .../DatabaseConcernsHasAttributesTest.php | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index d02f8f617128..fe2bc1f808c3 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -739,8 +739,7 @@ protected function mutateAttributeForArray($key, $value) { if ($this->isClassCastable($key)) { $value = $this->getClassCastableAttributeValue($key, $value); - } elseif (isset(static::$getAttributeMutatorCache[get_class($this)][$key]) && - static::$getAttributeMutatorCache[get_class($this)][$key] === true) { + } elseif ($this->hasAttributeGetMutator($key)) { $value = $this->mutateAttributeMarkedAttribute($key, $value); $value = $value instanceof DateTimeInterface diff --git a/tests/Database/DatabaseConcernsHasAttributesTest.php b/tests/Database/DatabaseConcernsHasAttributesTest.php index ac931b034a26..8709e2b9a6f2 100644 --- a/tests/Database/DatabaseConcernsHasAttributesTest.php +++ b/tests/Database/DatabaseConcernsHasAttributesTest.php @@ -61,6 +61,25 @@ public function testUnsettingCachedAttribute() $this->assertFalse($instance->cachedAttributeIsset('cacheableProperty')); } + + public function testSnakeCaseMutateAttributeMarkedAttribute() + { + $instance = new HasAttributesWithSnakeCaseConsistentCheck(); + $this->assertEquals('foo1Bar', $instance->getAttribute('foo1Bar')); + $this->assertEquals('foo1Bar', $instance->getAttribute('foo1bar')); + $this->assertEquals('foo1Bar', $instance->getAttribute('foo_1_bar')); + $this->assertEquals('foo1Bar', $instance->getAttribute('foo1_bar')); + $this->assertEquals('foo1Bar', $instance->getAttribute('foo_1bar')); + } + + public function testSnakeCaseMutateAttribute() + { + $instance = new HasAttributesWithSnakeCaseConsistentCheck(); + $this->assertEquals('foo2Bar', $instance->getAttribute('foo2Bar')); + $this->assertEquals('foo2Bar', $instance->getAttribute('foo2bar')); + $this->assertEquals('foo2Bar', $instance->getAttribute('foo_2_bar')); + $this->assertEquals('foo2Bar', $instance->getAttribute('foo_2bar')); + } } class HasAttributesWithoutConstructor @@ -118,3 +137,19 @@ public function cachedAttributeIsset($attribute): bool return isset($this->attributeCastCache[$attribute]); } } + +class HasAttributesWithSnakeCaseConsistentCheck extends Model +{ + public function foo1Bar(): Attribute + { + return Attribute::make( + get: fn () => 'foo1Bar' + ); + } + + public function getFoo2BarAttribute(): string + { + return 'foo2Bar'; + } + +} From 0459febc29966a50fe703b1eb2468b9328c7879c Mon Sep 17 00:00:00 2001 From: Pandi Selvam Date: Wed, 12 Feb 2025 18:31:45 +0530 Subject: [PATCH 2/3] Style CI issue fixed --- tests/Database/DatabaseConcernsHasAttributesTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Database/DatabaseConcernsHasAttributesTest.php b/tests/Database/DatabaseConcernsHasAttributesTest.php index 8709e2b9a6f2..fd03cddb2679 100644 --- a/tests/Database/DatabaseConcernsHasAttributesTest.php +++ b/tests/Database/DatabaseConcernsHasAttributesTest.php @@ -151,5 +151,4 @@ public function getFoo2BarAttribute(): string { return 'foo2Bar'; } - } From 65b56af71448ed37f169e11f60fb31d999588563 Mon Sep 17 00:00:00 2001 From: Pandi Selvam Date: Wed, 12 Feb 2025 18:36:19 +0530 Subject: [PATCH 3/3] Fix: add one new assertion --- tests/Database/DatabaseConcernsHasAttributesTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Database/DatabaseConcernsHasAttributesTest.php b/tests/Database/DatabaseConcernsHasAttributesTest.php index fd03cddb2679..e4e210fa4b41 100644 --- a/tests/Database/DatabaseConcernsHasAttributesTest.php +++ b/tests/Database/DatabaseConcernsHasAttributesTest.php @@ -78,6 +78,7 @@ public function testSnakeCaseMutateAttribute() $this->assertEquals('foo2Bar', $instance->getAttribute('foo2Bar')); $this->assertEquals('foo2Bar', $instance->getAttribute('foo2bar')); $this->assertEquals('foo2Bar', $instance->getAttribute('foo_2_bar')); + $this->assertEquals('foo2Bar', $instance->getAttribute('foo2_bar')); $this->assertEquals('foo2Bar', $instance->getAttribute('foo_2bar')); } }