Skip to content

Commit 8559fac

Browse files
committed
Fix $qb->expr()->isNull() and other methods that return scalars
1 parent f1a4f76 commit 8559fac

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

src/Type/Doctrine/QueryBuilder/Expr/ExpressionBuilderDynamicReturnTypeExtension.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
6464
return $defaultReturnType;
6565
}
6666

67-
$exprObject = $queryBuilder->expr()->{$methodReflection->getName()}(...$args);
67+
$exprValue = $queryBuilder->expr()->{$methodReflection->getName()}(...$args);
68+
if (is_object($exprValue)) {
69+
return new ExprType(get_class($exprValue), $exprValue);
70+
}
6871

69-
return new ExprType(get_class($exprObject), $exprObject);
72+
return $scope->getTypeFromValue($exprValue);
7073
}
7174

7275
}

tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ public function testRule(): void
7979
'QueryBuilder: [Semantical Error] line 0, col 72 near \'nickname LIKE\': Error: Class PHPStan\Rules\Doctrine\ORM\MyEntity has no field or association named nickname',
8080
194,
8181
],
82+
[
83+
'QueryBuilder: [Semantical Error] line 0, col 72 near \'nickname IS \': Error: Class PHPStan\Rules\Doctrine\ORM\MyEntity has no field or association named nickname',
84+
206,
85+
],
86+
[
87+
"QueryBuilder: [Syntax Error] line 0, col 80: Error: Expected =, <, <=, <>, >, >=, !=, got ')'\nDQL: SELECT e FROM PHPStan\Rules\Doctrine\ORM\MyEntity e WHERE e.id = 1 OR e.nickname) IS NULL",
88+
218,
89+
],
8290
]);
8391
}
8492

tests/Rules/Doctrine/ORM/data/query-builder-dql.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,28 @@ public function qbExpr(): void
200200
->getQuery();
201201
}
202202

203+
public function qbExprIsNull(): void
204+
{
205+
$queryBuilder = $this->entityManager->createQueryBuilder();
206+
$queryBuilder->select('e')
207+
->from(MyEntity::class, 'e')
208+
->add('where', $queryBuilder->expr()->orX(
209+
$queryBuilder->expr()->eq('e.id', '1'),
210+
$queryBuilder->expr()->isNull('e.nickname')
211+
))
212+
->getQuery();
213+
}
214+
215+
public function qbExprIsNullSyntaxError(): void
216+
{
217+
$queryBuilder = $this->entityManager->createQueryBuilder();
218+
$queryBuilder->select('e')
219+
->from(MyEntity::class, 'e')
220+
->add('where', $queryBuilder->expr()->orX(
221+
$queryBuilder->expr()->eq('e.id', '1'),
222+
$queryBuilder->expr()->isNull('e.nickname)')
223+
))
224+
->getQuery();
225+
}
226+
203227
}

0 commit comments

Comments
 (0)