From 750c21baf47977e42870ae70a3e0a63cfaa9d6d5 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Thu, 21 Sep 2023 11:21:19 -0300 Subject: [PATCH 1/3] Fix casting with custom column name --- src/Concerns/CastValues.php | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/Concerns/CastValues.php b/src/Concerns/CastValues.php index 580e7bf..960a1c4 100644 --- a/src/Concerns/CastValues.php +++ b/src/Concerns/CastValues.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Collection; use WendellAdriel\Lift\Attributes\Cast; +use WendellAdriel\Lift\Attributes\Column; use WendellAdriel\Lift\Attributes\Config; use WendellAdriel\Lift\Support\PropertyInfo; @@ -88,6 +89,26 @@ private static function buildCastableProperties(Collection $properties): void continue; } + $configAttribute = $property->attributes->first(fn ($attribute) => $attribute->getName() === Config::class); + if (filled($configAttribute)) { + $configAttribute = $configAttribute->newInstance(); + if (filled($configAttribute->column)) { + self::$modelCastableProperties[static::class][$configAttribute->column] = $castAttribute->getArguments()[0]; + + continue; + } + } + + $columnAttribute = $property->attributes->first(fn ($attribute) => $attribute->getName() === Column::class); + if (filled($columnAttribute)) { + $columnAttribute = $columnAttribute->newInstance(); + if (filled($columnAttribute->name)) { + self::$modelCastableProperties[static::class][$columnAttribute->name] = $castAttribute->getArguments()[0]; + + continue; + } + } + self::$modelCastableProperties[static::class][$property->name] = $castAttribute->getArguments()[0]; } @@ -103,6 +124,22 @@ private static function buildCastableProperties(Collection $properties): void continue; } + if (filled($configAttribute->column)) { + self::$modelCastableProperties[static::class][$configAttribute->column] = $configAttribute->cast; + + continue; + } + + $columnAttribute = $property->attributes->first(fn ($attribute) => $attribute->getName() === Column::class); + if (filled($columnAttribute)) { + $columnAttribute = $columnAttribute->newInstance(); + if (filled($columnAttribute->name)) { + self::$modelCastableProperties[static::class][$columnAttribute->name] = $configAttribute->cast; + + continue; + } + } + self::$modelCastableProperties[static::class][$property->name] = $configAttribute->cast; } } From ebdc220ecb26cb9f3a69e9891ec811263507151f Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Thu, 21 Sep 2023 11:22:47 -0300 Subject: [PATCH 2/3] New test case to test casting with custom column names. --- tests/Datasets/ProductColumn.php | 43 ++++++++++++++++++++++++++++++++ tests/Feature/CastTest.php | 20 +++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 tests/Datasets/ProductColumn.php diff --git a/tests/Datasets/ProductColumn.php b/tests/Datasets/ProductColumn.php new file mode 100644 index 0000000..27d691c --- /dev/null +++ b/tests/Datasets/ProductColumn.php @@ -0,0 +1,43 @@ +and($product->expires_at->format('Y-m-d H:i:s'))->toBe('2023-12-31 23:59:59') ->and($product->json_column)->toBe(['foo' => 'bar']); }); + +it('casts values when retrieving model with custom columns', function () { + ProductColumn::create([ + 'name' => 'Product 1', + 'price' => '10.99', + 'random_number' => '123', + 'expires_at' => '2023-12-31 23:59:59', + 'json_column' => ['foo' => 'bar'], + ]); + + $product = Product::query()->first(); + + expect($product->name)->toBe('Product 1') + ->and($product->price)->toBe(10.99) + ->and($product->random_number)->toBe(123) + ->and($product->expires_at)->toBeInstanceOf(Carbon\CarbonImmutable::class) + ->and($product->expires_at->format('Y-m-d H:i:s'))->toBe('2023-12-31 23:59:59') + ->and($product->json_column)->toBe(['foo' => 'bar']); +}); From 2949d2c2fd9942dd303c097317995cff38584256 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Thu, 21 Sep 2023 11:23:54 -0300 Subject: [PATCH 3/3] Lint --- tests/Feature/CastTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/CastTest.php b/tests/Feature/CastTest.php index 1d19537..2e29bdd 100644 --- a/tests/Feature/CastTest.php +++ b/tests/Feature/CastTest.php @@ -148,7 +148,7 @@ 'expires_at' => '2023-12-31 23:59:59', 'json_column' => ['foo' => 'bar'], ]); - + $product = Product::query()->first(); expect($product->name)->toBe('Product 1')