Skip to content

Commit 7740b80

Browse files
committed
Merge branch 'uno-sw-patch-1'
2 parents dc70337 + d6fb790 commit 7740b80

File tree

6 files changed

+87
-36
lines changed

6 files changed

+87
-36
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Add support for multiple pivot types when using the same accessor.
2020

2121
### Added
2222

23+
- Add support for AsCollection::using and AsEnumCollection::of casts [#1577 / uno-sw](https://github.com/barryvdh/laravel-ide-helper/pull/1577)
24+
2325
2024-07-12, 3.1.0
2426
------------------
2527

src/Console/ModelsCommand.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,6 @@ public function castPropertiesType($model)
410410
case 'immutable_datetime':
411411
$realType = '\Carbon\CarbonImmutable';
412412
break;
413-
case AsCollection::class:
414-
case AsEnumCollection::class:
415413
case 'collection':
416414
$realType = '\Illuminate\Support\Collection';
417415
break;
@@ -437,6 +435,18 @@ public function castPropertiesType($model)
437435
continue;
438436
}
439437

438+
if (Str::startsWith($type, AsCollection::class)) {
439+
$realType = $this->getTypeInModel($model, $params[0] ?? null) ?? '\Illuminate\Support\Collection';
440+
}
441+
442+
if (Str::startsWith($type, AsEnumCollection::class)) {
443+
$realType = '\Illuminate\Support\Collection';
444+
$relatedModel = $this->getTypeInModel($model, $params[0] ?? null);
445+
if ($relatedModel) {
446+
$realType = $this->getCollectionTypeHint($realType, $relatedModel);
447+
}
448+
}
449+
440450
$realType = $this->checkForCastableCasts($realType, $params);
441451
$realType = $this->checkForCustomLaravelCasts($realType);
442452
$realType = $this->getTypeOverride($realType);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections;
6+
7+
use Illuminate\Support\Collection;
8+
9+
class AdvancedCastCollection extends Collection
10+
{
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums;
6+
7+
enum AdvancedCastEnum
8+
{
9+
case apple;
10+
case banana;
11+
case orange;
12+
}

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

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,35 @@
44

55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
66

7+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
8+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
79
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
810
use Illuminate\Database\Eloquent\Casts\AsCollection;
911
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
1012
use Illuminate\Database\Eloquent\Model;
1113

1214
class AdvancedCast extends Model
1315
{
14-
protected $casts = [
15-
'cast_to_date_serialization' => 'date:Y-m-d',
16-
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
17-
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
18-
'cast_to_immutable_date' => 'immutable_date',
19-
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
20-
'cast_to_immutable_datetime' => 'immutable_datetime',
21-
'cast_to_timestamp' => 'timestamp',
22-
'cast_to_encrypted' => 'encrypted',
23-
'cast_to_encrypted_array' => 'encrypted:array',
24-
'cast_to_encrypted_collection' => 'encrypted:collection',
25-
'cast_to_encrypted_json' => 'encrypted:json',
26-
'cast_to_encrypted_object' => 'encrypted:object',
27-
'cast_to_as_collection' => AsCollection::class,
28-
'cast_to_as_enum_collection' => AsEnumCollection::class,
29-
'cast_to_as_array_object' => AsArrayObject::class,
30-
];
16+
protected function casts(): array
17+
{
18+
return [
19+
'cast_to_date_serialization' => 'date:Y-m-d',
20+
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
21+
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
22+
'cast_to_immutable_date' => 'immutable_date',
23+
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
24+
'cast_to_immutable_datetime' => 'immutable_datetime',
25+
'cast_to_timestamp' => 'timestamp',
26+
'cast_to_encrypted' => 'encrypted',
27+
'cast_to_encrypted_array' => 'encrypted:array',
28+
'cast_to_encrypted_collection' => 'encrypted:collection',
29+
'cast_to_encrypted_json' => 'encrypted:json',
30+
'cast_to_encrypted_object' => 'encrypted:object',
31+
'cast_to_as_collection' => AsCollection::class,
32+
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
33+
'cast_to_as_enum_collection' => AsEnumCollection::class,
34+
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
35+
'cast_to_as_array_object' => AsArrayObject::class,
36+
];
37+
}
3138
}

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

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
66

7+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
8+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
79
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
810
use Illuminate\Database\Eloquent\Casts\AsCollection;
911
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
@@ -27,6 +29,8 @@
2729
* @property \Illuminate\Support\Collection $cast_to_as_collection
2830
* @property \Illuminate\Support\Collection $cast_to_as_enum_collection
2931
* @property \ArrayObject $cast_to_as_array_object
32+
* @property AdvancedCastCollection $cast_to_as_collection_using
33+
* @property \Illuminate\Support\Collection<int, AdvancedCastEnum> $cast_to_as_enum_collection_of
3034
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newModelQuery()
3135
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newQuery()
3236
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast query()
@@ -49,21 +53,26 @@
4953
*/
5054
class AdvancedCast extends Model
5155
{
52-
protected $casts = [
53-
'cast_to_date_serialization' => 'date:Y-m-d',
54-
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
55-
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
56-
'cast_to_immutable_date' => 'immutable_date',
57-
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
58-
'cast_to_immutable_datetime' => 'immutable_datetime',
59-
'cast_to_timestamp' => 'timestamp',
60-
'cast_to_encrypted' => 'encrypted',
61-
'cast_to_encrypted_array' => 'encrypted:array',
62-
'cast_to_encrypted_collection' => 'encrypted:collection',
63-
'cast_to_encrypted_json' => 'encrypted:json',
64-
'cast_to_encrypted_object' => 'encrypted:object',
65-
'cast_to_as_collection' => AsCollection::class,
66-
'cast_to_as_enum_collection' => AsEnumCollection::class,
67-
'cast_to_as_array_object' => AsArrayObject::class,
68-
];
56+
protected function casts(): array
57+
{
58+
return [
59+
'cast_to_date_serialization' => 'date:Y-m-d',
60+
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
61+
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
62+
'cast_to_immutable_date' => 'immutable_date',
63+
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
64+
'cast_to_immutable_datetime' => 'immutable_datetime',
65+
'cast_to_timestamp' => 'timestamp',
66+
'cast_to_encrypted' => 'encrypted',
67+
'cast_to_encrypted_array' => 'encrypted:array',
68+
'cast_to_encrypted_collection' => 'encrypted:collection',
69+
'cast_to_encrypted_json' => 'encrypted:json',
70+
'cast_to_encrypted_object' => 'encrypted:object',
71+
'cast_to_as_collection' => AsCollection::class,
72+
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
73+
'cast_to_as_enum_collection' => AsEnumCollection::class,
74+
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
75+
'cast_to_as_array_object' => AsArrayObject::class,
76+
];
77+
}
6978
}

0 commit comments

Comments
 (0)