Skip to content

Commit df90b88

Browse files
committed
Support AsCollection::of($map), AsCollection::using($class, $map)
1 parent ae0a06d commit df90b88

File tree

5 files changed

+35
-2
lines changed

5 files changed

+35
-2
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"orchestra/testbench": "^9.2 || ^10",
4040
"phpunit/phpunit": "^10.5 || ^11.5.3",
4141
"spatie/phpunit-snapshot-assertions": "^4 || ^5",
42-
"vimeo/psalm": "^5.4",
42+
"vimeo/psalm": "^5.4|^6.2",
4343
"vlucas/phpdotenv": "^5"
4444
},
4545
"suggest": {

src/Console/ModelsCommand.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,11 @@ public function castPropertiesType($model)
475475
}
476476

477477
if (Str::startsWith($type, AsCollection::class)) {
478-
$realType = $this->getTypeInModel($model, $params[0] ?? null) ?? '\Illuminate\Support\Collection';
478+
$realType = $this->getTypeInModel($model, $params[0] ?? null) ?: '\Illuminate\Support\Collection';
479+
$relatedModel = $this->getTypeInModel($model, $params[1] ?? null);
480+
if ($relatedModel) {
481+
$realType = $this->getCollectionTypeHint($realType, $relatedModel);
482+
}
479483
}
480484

481485
if (Str::startsWith($type, AsEnumCollection::class)) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections;
6+
7+
use Illuminate\Contracts\Support\Arrayable;
8+
use JsonSerializable;
9+
10+
class AdvancedCastMap implements Arrayable, JsonSerializable
11+
{
12+
public function toArray(): array
13+
{
14+
return [];
15+
}
16+
17+
public function jsonSerialize(): array
18+
{
19+
return $this->toArray();
20+
}
21+
}

tests/Console/ModelsCommand/AdvancedCasts/Models/AdvancedCast.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
66

77
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
8+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastMap;
89
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
910
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
1011
use Illuminate\Database\Eloquent\Casts\AsCollection;
@@ -29,7 +30,9 @@ protected function casts(): array
2930
'cast_to_encrypted_json' => 'encrypted:json',
3031
'cast_to_encrypted_object' => 'encrypted:object',
3132
'cast_to_as_collection' => AsCollection::class,
33+
'cast_to_as_collection_of' => AsCollection::of(AdvancedCastMap::class),
3234
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
35+
'cast_to_as_collection_using_and_map' => AsCollection::using(AdvancedCastCollection::class, AdvancedCastMap::class),
3336
'cast_to_as_enum_collection' => AsEnumCollection::class,
3437
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
3538
'cast_to_as_array_object' => AsArrayObject::class,

tests/Console/ModelsCommand/AdvancedCasts/__snapshots__/Test__test__1.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
66

77
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
8+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastMap;
89
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
910
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
1011
use Illuminate\Database\Eloquent\Casts\AsCollection;
@@ -29,7 +30,9 @@
2930
* @property \Illuminate\Support\Collection $cast_to_as_collection
3031
* @property \Illuminate\Support\Collection $cast_to_as_enum_collection
3132
* @property \Illuminate\Database\Eloquent\Casts\ArrayObject<array-key, mixed> $cast_to_as_array_object
33+
* @property \Illuminate\Support\Collection<int, AdvancedCastMap> $cast_to_as_collection_of
3234
* @property AdvancedCastCollection $cast_to_as_collection_using
35+
* @property AdvancedCastCollection<int, AdvancedCastMap> $cast_to_as_collection_using_and_map
3336
* @property \Illuminate\Support\Collection<int, AdvancedCastEnum> $cast_to_as_enum_collection_of
3437
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newModelQuery()
3538
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newQuery()
@@ -69,7 +72,9 @@ protected function casts(): array
6972
'cast_to_encrypted_json' => 'encrypted:json',
7073
'cast_to_encrypted_object' => 'encrypted:object',
7174
'cast_to_as_collection' => AsCollection::class,
75+
'cast_to_as_collection_of' => AsCollection::of(AdvancedCastMap::class),
7276
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
77+
'cast_to_as_collection_using_and_map' => AsCollection::using(AdvancedCastCollection::class, AdvancedCastMap::class),
7378
'cast_to_as_enum_collection' => AsEnumCollection::class,
7479
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
7580
'cast_to_as_array_object' => AsArrayObject::class,

0 commit comments

Comments
 (0)