diff --git a/src/Eloquent/Builder.php b/src/Eloquent/Builder.php index 240f01a57..2c8121e59 100644 --- a/src/Eloquent/Builder.php +++ b/src/Eloquent/Builder.php @@ -223,9 +223,9 @@ public function decrement($column, $amount = 1, array $extra = []) } /** - * @param (Closure():T)|Expression|null $value + * @param (Closure(\MongoDB\Collection):T)|Expression|null $value * - * @return ($value is Closure ? T : ($value is null ? Collection : Expression)) + * @return ($value is Closure ? (T is CursorInterface ? Collection : T|TModel|Collection) : ($value is null ? \MongoDB\Collection : \Illuminate\Contracts\Database\Query\Expression)) * * @template T */ diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 1faafff3f..36c156684 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -1045,9 +1045,9 @@ public function lists($column, $key = null) } /** - * @param (Closure():T)|Expression|null $value + * @param (Closure(\MongoDB\Collection):T)|Expression|null $value * - * @return ($value is Closure ? T : ($value is null ? Collection : Expression)) + * @return ($value is Closure ? T : ($value is null ? \MongoDB\Collection : Expression)) * * @template T */ diff --git a/tests/PHPStan/BuilderRawTypes.php b/tests/PHPStan/BuilderRawTypes.php new file mode 100644 index 000000000..de1369d11 --- /dev/null +++ b/tests/PHPStan/BuilderRawTypes.php @@ -0,0 +1,73 @@ +raw()); + } + + public static function queryBuilderRawClosureFind(QueryBuilder $queryBuilder): void + { + assertType('MongoDB\Driver\CursorInterface', $queryBuilder->raw(fn (MongoDBCollection $c) => $c->find([]))); + } + + public static function queryBuilderRawClosureFindOne(QueryBuilder $queryBuilder): void + { + assertType('array|object|null', $queryBuilder->raw(fn (MongoDBCollection $c) => $c->findOne([]))); + } + + public static function queryBuilderRawExpression(QueryBuilder $queryBuilder): void + { + assertType('Illuminate\Database\Query\Expression', $queryBuilder->raw(new Expression('foo'))); + } + + /** @param EloquentBuilder $builder */ + public static function eloquentBuilderRawNull(EloquentBuilder $builder): void + { + assertType('MongoDB\Collection', $builder->raw()); + } + + /** @param EloquentBuilder $builder */ + public static function eloquentBuilderRawClosureFind(EloquentBuilder $builder): void + { + assertType( + 'Illuminate\Database\Eloquent\Collection', + $builder->raw(fn (MongoDBCollection $c) => $c->find([])), + ); + } + + /** @param EloquentBuilder $builder */ + public static function eloquentBuilderRawExpression(EloquentBuilder $builder): void + { + assertType('Illuminate\Contracts\Database\Query\Expression', $builder->raw(new Expression('foo'))); + } + + /** @param EloquentBuilder $builder */ + public static function eloquentBuilderRawClosureFindOne(EloquentBuilder $builder): void + { + // PHPStan simplifies User|Collection|array|object|null to array|object|null + // because object is a supertype of User and Collection. + assertType( + 'array|object|null', + $builder->raw(fn (MongoDBCollection $c) => $c->findOne([])), + ); + } +}