diff --git a/src/Type/Doctrine/ArgumentsProcessor.php b/src/Type/Doctrine/ArgumentsProcessor.php index 2cd94fd74..bac4e5085 100644 --- a/src/Type/Doctrine/ArgumentsProcessor.php +++ b/src/Type/Doctrine/ArgumentsProcessor.php @@ -7,6 +7,7 @@ use PHPStan\Rules\Doctrine\ORM\DynamicQueryBuilderArgumentException; use PHPStan\Type\Doctrine\QueryBuilder\Expr\ExprType; use function count; +use function in_array; use function strpos; /** @api */ @@ -32,7 +33,7 @@ public function processArgs( ): array { $args = []; - foreach ($methodCallArgs as $arg) { + foreach ($methodCallArgs as $argIndex => $arg) { if ($arg->unpack) { throw new DynamicQueryBuilderArgumentException(); } @@ -61,12 +62,14 @@ public function processArgs( if ($value->isClassString()->yes() && count($value->getClassStringObjectType()->getObjectClassNames()) === 1) { /** @var class-string $className */ $className = $value->getClassStringObjectType()->getObjectClassNames()[0]; - if ($this->objectMetadataResolver->isTransient($className)) { - throw new DynamicQueryBuilderArgumentException(); + $isEntityClassArgument = $argIndex === 0 && in_array($methodName, ['from', 'join', 'innerJoin', 'leftJoin'], true); + if ($isEntityClassArgument) { + if ($this->objectMetadataResolver->isTransient($className)) { + throw new DynamicQueryBuilderArgumentException(); + } + $args[] = $className; + continue; } - - $args[] = $className; - continue; } if (count($value->getConstantScalarValues()) !== 1) { diff --git a/tests/Type/Doctrine/data/QueryResult/queryBuilderGetQuery.php b/tests/Type/Doctrine/data/QueryResult/queryBuilderGetQuery.php index c0cf30680..49a1b8a75 100644 --- a/tests/Type/Doctrine/data/QueryResult/queryBuilderGetQuery.php +++ b/tests/Type/Doctrine/data/QueryResult/queryBuilderGetQuery.php @@ -310,4 +310,14 @@ public function testNonEntityClassString(EntityManagerInterface $em, string $cla assertType('mixed', $result); } + public function testEventAlias(EntityManagerInterface $em): void + { + $query = $em->createQueryBuilder() + ->select('event') + ->from(Many::class, 'event') + ->getQuery(); + + assertType('Doctrine\ORM\Query', $query); + } + }