Skip to content

Commit 6c4ba2a

Browse files
authored
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`
1 parent 1815a61 commit 6c4ba2a

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

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::class . ':,' . AdvancedCastMap::class, // since 12.10
3234
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
35+
'cast_to_as_collection_using_and_map' => AsCollection::class . ':' . AdvancedCastCollection::class. ',' . AdvancedCastMap::class, // since 12.10
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::class . ':,' . AdvancedCastMap::class, // since 12.10
7276
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
77+
'cast_to_as_collection_using_and_map' => AsCollection::class . ':' . AdvancedCastCollection::class. ',' . AdvancedCastMap::class, // since 12.10
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)