Skip to content

Commit bfefffe

Browse files
authored
toIterable type support
1 parent 6529c7a commit bfefffe

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ This extension provides following features:
1818
* Adds missing `matching` method on `Doctrine\Common\Collections\Collection`. This can be turned off by setting `parameters.doctrine.allCollectionsSelectable` to `false`.
1919
* Also supports Doctrine ODM.
2020
* Analysis of discrepancies between entity column types and property field types. This can be relaxed with the `allowNullablePropertyForRequiredField: true` setting.
21-
* Provides return type for `Doctrine\ORM\Query::getResult`, `getOneOrNullResult`, `getSingleResult`, and `execute` in `HYDRATE_OBJECT` mode (see bellow).
21+
* Provides return type for `Doctrine\ORM\Query::getResult`, `getOneOrNullResult`, `getSingleResult`, `toIterable` and `execute` in `HYDRATE_OBJECT` mode (see bellow).
2222

2323
## Installation
2424

@@ -140,7 +140,7 @@ $query->getResult(); // array<User>
140140
$query->getResult(Query::HYDRATE_OBJECT); // array<User>
141141
```
142142

143-
The methods `getOneOrNullResult`, `getSingleResult`, and `execute` are supported when the hydrateMode argument is explicitly set to `Query::HYDRATE_OBJECT`:
143+
The methods `getOneOrNullResult`, `getSingleResult`, `toIterable`, and `execute` are supported when the hydrateMode argument is explicitly set to `Query::HYDRATE_OBJECT`:
144144

145145
``` php
146146
$query = $entityManager->createQuery('SELECT u FROM Acme\User u');

src/Type/Doctrine/Query/QueryResultDynamicReturnTypeExtension.php

+7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1414
use PHPStan\Type\Generic\GenericObjectType;
1515
use PHPStan\Type\IntegerType;
16+
use PHPStan\Type\IterableType;
1617
use PHPStan\Type\MixedType;
1718
use PHPStan\Type\NullType;
1819
use PHPStan\Type\Type;
@@ -24,6 +25,7 @@ final class QueryResultDynamicReturnTypeExtension implements DynamicMethodReturn
2425

2526
private const METHOD_HYDRATION_MODE_ARG = [
2627
'getResult' => 0,
28+
'toIterable' => 1,
2729
'execute' => 1,
2830
'executeIgnoreQueryCache' => 1,
2931
'executeUsingQueryCache' => 1,
@@ -118,6 +120,11 @@ private function getMethodReturnTypeForHydrationMode(
118120
return $queryResultType;
119121
case 'getOneOrNullResult':
120122
return TypeCombinator::addNull($queryResultType);
123+
case 'toIterable':
124+
return new IterableType(
125+
new MixedType(),
126+
$queryResultType
127+
);
121128
default:
122129
return new ArrayType(
123130
new MixedType(),

tests/Type/Doctrine/data/QueryResult/queryResult.php

+28
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public function testReturnTypeOfQueryMethodsWithImplicitHydrationMode(EntityMana
4444
'array<QueryResult\Entities\Many>',
4545
$query->getResult()
4646
);
47+
assertType(
48+
'iterable<QueryResult\Entities\Many>',
49+
$query->toIterable()
50+
);
4751
assertType(
4852
'mixed',
4953
$query->execute()
@@ -82,6 +86,10 @@ public function testReturnTypeOfQueryMethodsWithExplicitObjectHydrationMode(Enti
8286
'array<QueryResult\Entities\Many>',
8387
$query->getResult(AbstractQuery::HYDRATE_OBJECT)
8488
);
89+
assertType(
90+
'iterable<QueryResult\Entities\Many>',
91+
$query->toIterable([], AbstractQuery::HYDRATE_OBJECT)
92+
);
8593
assertType(
8694
'array<QueryResult\Entities\Many>',
8795
$query->execute(null, AbstractQuery::HYDRATE_OBJECT)
@@ -150,6 +158,10 @@ public function testReturnTypeOfQueryMethodsWithExplicitNonObjectHydrationMode(E
150158
'mixed',
151159
$query->getResult(AbstractQuery::HYDRATE_ARRAY)
152160
);
161+
assertType(
162+
'iterable',
163+
$query->toIterable([], AbstractQuery::HYDRATE_ARRAY)
164+
);
153165
assertType(
154166
'mixed',
155167
$query->execute(null, AbstractQuery::HYDRATE_ARRAY)
@@ -190,6 +202,10 @@ public function testReturnTypeOfQueryMethodsWithExplicitNonConstantHydrationMode
190202
'mixed',
191203
$query->getResult($hydrationMode)
192204
);
205+
assertType(
206+
'iterable',
207+
$query->toIterable([], $hydrationMode)
208+
);
193209
assertType(
194210
'mixed',
195211
$query->execute(null, $hydrationMode)
@@ -224,6 +240,10 @@ public function testReturnTypeOfQueryMethodsWithReturnTypeIsMixed(EntityManagerI
224240
'mixed',
225241
$query->getResult(AbstractQuery::HYDRATE_OBJECT)
226242
);
243+
assertType(
244+
'iterable',
245+
$query->toIterable([], AbstractQuery::HYDRATE_OBJECT)
246+
);
227247
assertType(
228248
'mixed',
229249
$query->execute(null, AbstractQuery::HYDRATE_OBJECT)
@@ -260,6 +280,10 @@ public function testReturnTypeOfQueryMethodsWithReturnTypeIsTemplateMixedType(En
260280
'mixed',
261281
$query->getResult(AbstractQuery::HYDRATE_OBJECT)
262282
);
283+
assertType(
284+
'iterable',
285+
$query->toIterable([], AbstractQuery::HYDRATE_OBJECT)
286+
);
263287
assertType(
264288
'mixed',
265289
$query->execute(null, AbstractQuery::HYDRATE_OBJECT)
@@ -296,6 +320,10 @@ public function testReturnTypeOfQueryMethodsWithReturnTypeIsNonVoidTemplate(Enti
296320
'array<T of array|object (method QueryResult\queryResult\QueryResultTest::testReturnTypeOfQueryMethodsWithReturnTypeIsNonVoidTemplate(), argument)>',
297321
$query->getResult(AbstractQuery::HYDRATE_OBJECT)
298322
);
323+
assertType(
324+
'iterable<T of array|object (method QueryResult\queryResult\QueryResultTest::testReturnTypeOfQueryMethodsWithReturnTypeIsNonVoidTemplate(), argument)>',
325+
$query->toIterable([], AbstractQuery::HYDRATE_OBJECT)
326+
);
299327
assertType(
300328
'array<T of array|object (method QueryResult\queryResult\QueryResultTest::testReturnTypeOfQueryMethodsWithReturnTypeIsNonVoidTemplate(), argument)>',
301329
$query->execute(null, AbstractQuery::HYDRATE_OBJECT)

0 commit comments

Comments
 (0)