diff --git a/CHANGELOG.md b/CHANGELOG.md index c31efa082..13a833154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - fix: Eloquent builder `whereRelation()` losing the TModelClass generic type by @mad-briller. - feat: updated return type of the Validator::safe and FormRequest::safe method by @jdjfisher - feat: Added stub for the DB::transaction method by @jdjfisher +- feat: conditional return types for `Eloquent\Collection::find()` by @sebdesign - feat: add support for generic paginators by @erikgaal ## [2.2.0] - 2022-08-31 diff --git a/src/ReturnTypes/CollectionGenericStaticMethodDynamicMethodReturnTypeExtension.php b/src/ReturnTypes/CollectionGenericStaticMethodDynamicMethodReturnTypeExtension.php index 9c4238eb8..df4778a31 100644 --- a/src/ReturnTypes/CollectionGenericStaticMethodDynamicMethodReturnTypeExtension.php +++ b/src/ReturnTypes/CollectionGenericStaticMethodDynamicMethodReturnTypeExtension.php @@ -28,7 +28,7 @@ public function getClass(): string public function isMethodSupported(MethodReflection $methodReflection): bool { if ($methodReflection->getDeclaringClass()->getName() === EloquentCollection::class) { - return false; + return in_array($methodReflection->getName(), ['find']); } return in_array($methodReflection->getName(), [ diff --git a/stubs/EloquentCollection.stub b/stubs/EloquentCollection.stub index d6a748242..15307f104 100644 --- a/stubs/EloquentCollection.stub +++ b/stubs/EloquentCollection.stub @@ -13,5 +13,14 @@ use Illuminate\Support\Collection as BaseCollection; */ class Collection extends BaseCollection implements QueueableCollection { - // .. + /** + * Find a model in the collection by key. + * + * @template TFindDefault + * + * @param mixed $key + * @param TFindDefault $default + * @phpstan-return ($key is \Illuminate\Database\Eloquent\Model ? TModel|TFindDefault : ($key is (\Illuminate\Contracts\Support\Arrayable|array) ? static : TModel|TFindDefault)) + */ + public function find($key, $default = null); } diff --git a/tests/Type/data/collection-generic-static-methods.php b/tests/Type/data/collection-generic-static-methods.php index d45021fa1..a92da3165 100644 --- a/tests/Type/data/collection-generic-static-methods.php +++ b/tests/Type/data/collection-generic-static-methods.php @@ -11,6 +11,7 @@ /** @var SupportCollection $items */ /** @var App\TransactionCollection $customEloquentCollection */ /** @var App\UserCollection $secondCustomEloquentCollection */ +/** @var User $user */ assertType('Illuminate\Database\Eloquent\Collection', EloquentCollection::range(1, 10)); assertType('Illuminate\Support\Collection', $collection->collapse()); @@ -18,6 +19,24 @@ assertType('Illuminate\Database\Eloquent\Collection>', $collection->crossJoin([1])); +assertType('Illuminate\Database\Eloquent\Collection', $collection->find($items)); +assertType('Illuminate\Database\Eloquent\Collection', $collection->find([1])); +assertType('App\User|null', $collection->find($user)); +assertType('App\User|null', $collection->find(1)); +assertType('App\User|bool', $collection->find(1, false)); + +assertType('App\TransactionCollection', $customEloquentCollection->find($items)); +assertType('App\TransactionCollection', $customEloquentCollection->find([1])); +assertType('App\Transaction|null', $customEloquentCollection->find($user)); +assertType('App\Transaction|null', $customEloquentCollection->find(1)); +assertType('App\Transaction|bool', $customEloquentCollection->find(1, false)); + +assertType('App\UserCollection', $secondCustomEloquentCollection->find($items)); +assertType('App\UserCollection', $secondCustomEloquentCollection->find([1])); +assertType('App\User|null', $secondCustomEloquentCollection->find($user)); +assertType('App\User|null', $secondCustomEloquentCollection->find(1)); +assertType('App\User|bool', $secondCustomEloquentCollection->find(1, false)); + assertType('Illuminate\Support\Collection', $collection->flatten()); assertType('Illuminate\Support\Collection', $items->flatten()); diff --git a/tests/Type/data/collection-stubs.php b/tests/Type/data/collection-stubs.php index b98c2c9bd..f37d3bcd2 100644 --- a/tests/Type/data/collection-stubs.php +++ b/tests/Type/data/collection-stubs.php @@ -9,6 +9,7 @@ /** @var EloquentCollection $collection */ /** @var SupportCollection $items */ +/** @var User $user */ assertType('Illuminate\Database\Eloquent\Collection', User::all()->each(function (User $user, int $key): void { })); @@ -20,6 +21,12 @@ return (string) $item; })); +assertType('Illuminate\Database\Eloquent\Collection', $collection->find($items)); +assertType('Illuminate\Database\Eloquent\Collection', $collection->find([1])); +assertType('App\User|null', $collection->find($user)); +assertType('App\User|null', $collection->find(1)); +assertType('App\User|bool', $collection->find(1, false)); + assertType('Illuminate\Support\Collection', $collection->pluck('id')); assertType('Illuminate\Database\Eloquent\Collection', User::all()->mapInto(User::class));