Skip to content

Commit b00def6

Browse files
Merge 5.8 into 5.x (#3527)
2 parents 7cfeb7a + e8b6842 commit b00def6

3 files changed

Lines changed: 77 additions & 4 deletions

File tree

src/Eloquent/Builder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ public function decrement($column, $amount = 1, array $extra = [])
223223
}
224224

225225
/**
226-
* @param (Closure():T)|Expression|null $value
226+
* @param (Closure(\MongoDB\Collection):T)|Expression|null $value
227227
*
228-
* @return ($value is Closure ? T : ($value is null ? Collection : Expression))
228+
* @return ($value is Closure ? (T is CursorInterface ? Collection<int, TModel> : T|TModel|Collection<int, TModel>) : ($value is null ? \MongoDB\Collection : \Illuminate\Contracts\Database\Query\Expression))
229229
*
230230
* @template T
231231
*/

src/Query/Builder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,9 +1045,9 @@ public function lists($column, $key = null)
10451045
}
10461046

10471047
/**
1048-
* @param (Closure():T)|Expression|null $value
1048+
* @param (Closure(\MongoDB\Collection):T)|Expression|null $value
10491049
*
1050-
* @return ($value is Closure ? T : ($value is null ? Collection : Expression))
1050+
* @return ($value is Closure ? T : ($value is null ? \MongoDB\Collection : Expression))
10511051
*
10521052
* @template T
10531053
*/

tests/PHPStan/BuilderRawTypes.php

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MongoDB\Laravel\Tests\PHPStan;
6+
7+
use Illuminate\Database\Query\Expression;
8+
use MongoDB\Collection as MongoDBCollection;
9+
use MongoDB\Laravel\Eloquent\Builder as EloquentBuilder;
10+
use MongoDB\Laravel\Query\Builder as QueryBuilder;
11+
use MongoDB\Laravel\Tests\Models\User;
12+
13+
use function PHPStan\Testing\assertType;
14+
15+
/**
16+
* PHPStan type-level tests for Builder::raw() return and param types.
17+
* These functions are never executed at runtime — they exist to let PHPStan
18+
* validate that the @param and @return types on raw() match the declared signatures.
19+
*/
20+
final class BuilderRawTypes
21+
{
22+
public static function queryBuilderRawNull(QueryBuilder $queryBuilder): void
23+
{
24+
assertType('MongoDB\Collection', $queryBuilder->raw());
25+
}
26+
27+
public static function queryBuilderRawClosureFind(QueryBuilder $queryBuilder): void
28+
{
29+
assertType('MongoDB\Driver\CursorInterface', $queryBuilder->raw(fn (MongoDBCollection $c) => $c->find([])));
30+
}
31+
32+
public static function queryBuilderRawClosureFindOne(QueryBuilder $queryBuilder): void
33+
{
34+
assertType('array|object|null', $queryBuilder->raw(fn (MongoDBCollection $c) => $c->findOne([])));
35+
}
36+
37+
public static function queryBuilderRawExpression(QueryBuilder $queryBuilder): void
38+
{
39+
assertType('Illuminate\Database\Query\Expression', $queryBuilder->raw(new Expression('foo')));
40+
}
41+
42+
/** @param EloquentBuilder<User> $builder */
43+
public static function eloquentBuilderRawNull(EloquentBuilder $builder): void
44+
{
45+
assertType('MongoDB\Collection', $builder->raw());
46+
}
47+
48+
/** @param EloquentBuilder<User> $builder */
49+
public static function eloquentBuilderRawClosureFind(EloquentBuilder $builder): void
50+
{
51+
assertType(
52+
'Illuminate\Database\Eloquent\Collection<int, MongoDB\Laravel\Tests\Models\User>',
53+
$builder->raw(fn (MongoDBCollection $c) => $c->find([])),
54+
);
55+
}
56+
57+
/** @param EloquentBuilder<User> $builder */
58+
public static function eloquentBuilderRawExpression(EloquentBuilder $builder): void
59+
{
60+
assertType('Illuminate\Contracts\Database\Query\Expression', $builder->raw(new Expression('foo')));
61+
}
62+
63+
/** @param EloquentBuilder<User> $builder */
64+
public static function eloquentBuilderRawClosureFindOne(EloquentBuilder $builder): void
65+
{
66+
// PHPStan simplifies User|Collection<int, User>|array|object|null to array|object|null
67+
// because object is a supertype of User and Collection.
68+
assertType(
69+
'array|object|null',
70+
$builder->raw(fn (MongoDBCollection $c) => $c->findOne([])),
71+
);
72+
}
73+
}

0 commit comments

Comments
 (0)