Skip to content

Commit 1d32c42

Browse files
julienfalqueondrejmirtes
authored andcommitted
Fix empty DQL with QueryBuilder::setParameters()
1 parent 71bcd7d commit 1d32c42

File tree

4 files changed

+28
-2
lines changed

4 files changed

+28
-2
lines changed

src/Type/Doctrine/QueryBuilder/QueryBuilderMethodDynamicReturnTypeExtension.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Type\Doctrine\QueryBuilder;
44

5+
use Doctrine\ORM\QueryBuilder;
56
use PhpParser\Node;
67
use PhpParser\Node\Expr\MethodCall;
78
use PhpParser\Node\Identifier;
@@ -79,7 +80,7 @@ public function isMethodSupported(MethodReflection $methodReflection): bool
7980
if ($returnType instanceof MixedType) {
8081
return false;
8182
}
82-
return $returnType->isSuperTypeOf(new ObjectType($this->getClass()))->yes();
83+
return (new ObjectType(QueryBuilder::class))->isSuperTypeOf($returnType)->yes();
8384
}
8485

8586
public function getTypeFromMethodCall(

src/Type/Doctrine/QueryBuilder/QueryBuilderTypeSpecifyingExtension.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Type\Doctrine\QueryBuilder;
44

5+
use Doctrine\ORM\QueryBuilder;
56
use PhpParser\Node\Expr\MethodCall;
67
use PhpParser\Node\Identifier;
78
use PHPStan\Analyser\Scope;
@@ -65,7 +66,7 @@ public function specifyTypes(MethodReflection $methodReflection, MethodCall $nod
6566
if ($returnType instanceof MixedType) {
6667
return new SpecifiedTypes([]);
6768
}
68-
if (!$returnType->isSuperTypeOf(new ObjectType($this->getClass()))->yes()) {
69+
if (!(new ObjectType(QueryBuilder::class))->isSuperTypeOf($returnType)->yes()) {
6970
return new SpecifiedTypes([]);
7071
}
7172

tests/DoctrineIntegration/ORM/data/queryBuilder.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,27 @@ public function dynamicQueryBuilder(string $entityClass): Query
5454
return $queryBuilder->getQuery();
5555
}
5656

57+
public function usingMethodThatReturnStatic(): ?MyEntity
58+
{
59+
$queryBuilder = $this->entityManager->createQueryBuilder();
60+
61+
$queryBuilder
62+
->select('e')
63+
->from(MyEntity::class, 'e')
64+
->where('e.id = :id')
65+
->setParameters([
66+
'id' => 123,
67+
]);
68+
69+
return $queryBuilder->getQuery()->getOneOrNullResult();
70+
}
71+
72+
public function getCustomQueryBuilder(): CustomQueryBuilder
73+
{
74+
return $this->entityManager->createQueryBuilder();
75+
}
76+
}
77+
78+
class CustomQueryBuilder extends \Doctrine\ORM\QueryBuilder
79+
{
5780
}

tests/DoctrineIntegration/ORM/phpstan.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ parameters:
77
doctrine:
88
objectManagerLoader: entity-manager.php
99
reportDynamicQueryBuilders: true
10+
queryBuilderClass: PHPStan\DoctrineIntegration\ORM\QueryBuilder\CustomQueryBuilder

0 commit comments

Comments
 (0)