From 6c4ba2ad38f250b9a75ad7e977b2da244fcba8f7 Mon Sep 17 00:00:00 2001 From: erikn69 Date: Thu, 17 Jul 2025 00:23:52 -0500 Subject: [PATCH] Support `AsCollection::of($map)`, `AsCollection::using($class, $map)` (#1714) * Support `AsCollection::of($map)`, `AsCollection::using($class, $map)` * test compatibility(`of($map)`,`using($class, $map)` compiled), only laravel `>=12.10` --- src/Console/ModelsCommand.php | 6 +++++- .../Collections/AdvancedCastMap.php | 21 +++++++++++++++++++ .../AdvancedCasts/Models/AdvancedCast.php | 3 +++ .../__snapshots__/Test__test__1.php | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/Console/ModelsCommand/AdvancedCasts/Collections/AdvancedCastMap.php diff --git a/src/Console/ModelsCommand.php b/src/Console/ModelsCommand.php index 1c82e93..1cd7544 100644 --- a/src/Console/ModelsCommand.php +++ b/src/Console/ModelsCommand.php @@ -475,7 +475,11 @@ class ModelsCommand extends Command } if (Str::startsWith($type, AsCollection::class)) { - $realType = $this->getTypeInModel($model, $params[0] ?? null) ?? '\Illuminate\Support\Collection'; + $realType = $this->getTypeInModel($model, $params[0] ?? null) ?: '\Illuminate\Support\Collection'; + $relatedModel = $this->getTypeInModel($model, $params[1] ?? null); + if ($relatedModel) { + $realType = $this->getCollectionTypeHint($realType, $relatedModel); + } } if (Str::startsWith($type, AsEnumCollection::class)) { diff --git a/tests/Console/ModelsCommand/AdvancedCasts/Collections/AdvancedCastMap.php b/tests/Console/ModelsCommand/AdvancedCasts/Collections/AdvancedCastMap.php new file mode 100644 index 0000000..5dbd4e2 --- /dev/null +++ b/tests/Console/ModelsCommand/AdvancedCasts/Collections/AdvancedCastMap.php @@ -0,0 +1,21 @@ +toArray(); + } +} diff --git a/tests/Console/ModelsCommand/AdvancedCasts/Models/AdvancedCast.php b/tests/Console/ModelsCommand/AdvancedCasts/Models/AdvancedCast.php index 35ad6e2..1569da1 100644 --- a/tests/Console/ModelsCommand/AdvancedCasts/Models/AdvancedCast.php +++ b/tests/Console/ModelsCommand/AdvancedCasts/Models/AdvancedCast.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection; +use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastMap; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum; use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Casts\AsCollection; @@ -29,7 +30,9 @@ class AdvancedCast extends Model 'cast_to_encrypted_json' => 'encrypted:json', 'cast_to_encrypted_object' => 'encrypted:object', 'cast_to_as_collection' => AsCollection::class, + 'cast_to_as_collection_of' => AsCollection::class . ':,' . AdvancedCastMap::class, // since 12.10 'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class), + 'cast_to_as_collection_using_and_map' => AsCollection::class . ':' . AdvancedCastCollection::class. ',' . AdvancedCastMap::class, // since 12.10 'cast_to_as_enum_collection' => AsEnumCollection::class, 'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class), 'cast_to_as_array_object' => AsArrayObject::class, diff --git a/tests/Console/ModelsCommand/AdvancedCasts/__snapshots__/Test__test__1.php b/tests/Console/ModelsCommand/AdvancedCasts/__snapshots__/Test__test__1.php index fbb6719..8e90196 100644 --- a/tests/Console/ModelsCommand/AdvancedCasts/__snapshots__/Test__test__1.php +++ b/tests/Console/ModelsCommand/AdvancedCasts/__snapshots__/Test__test__1.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection; +use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastMap; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum; use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Casts\AsCollection; @@ -29,7 +30,9 @@ use Illuminate\Database\Eloquent\Model; * @property \Illuminate\Support\Collection $cast_to_as_collection * @property \Illuminate\Support\Collection $cast_to_as_enum_collection * @property \Illuminate\Database\Eloquent\Casts\ArrayObject $cast_to_as_array_object + * @property \Illuminate\Support\Collection $cast_to_as_collection_of * @property AdvancedCastCollection $cast_to_as_collection_using + * @property AdvancedCastCollection $cast_to_as_collection_using_and_map * @property \Illuminate\Support\Collection $cast_to_as_enum_collection_of * @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast newQuery() @@ -69,7 +72,9 @@ class AdvancedCast extends Model 'cast_to_encrypted_json' => 'encrypted:json', 'cast_to_encrypted_object' => 'encrypted:object', 'cast_to_as_collection' => AsCollection::class, + 'cast_to_as_collection_of' => AsCollection::class . ':,' . AdvancedCastMap::class, // since 12.10 'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class), + 'cast_to_as_collection_using_and_map' => AsCollection::class . ':' . AdvancedCastCollection::class. ',' . AdvancedCastMap::class, // since 12.10 'cast_to_as_enum_collection' => AsEnumCollection::class, 'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class), 'cast_to_as_array_object' => AsArrayObject::class,