Skip to content

Commit

Permalink
QueryBuilderGetQueryDynamicReturnTypeExtension: handle regular set us…
Browse files Browse the repository at this point in the history
…ages
  • Loading branch information
janedbal authored and ondrejmirtes committed Nov 21, 2023
1 parent 68fc764 commit 85def57
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/Type/Doctrine/ArgumentsProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class ArgumentsProcessor

/**
* @param Arg[] $methodCallArgs
* @return mixed[]
* @return list<mixed>
* @throws DynamicQueryBuilderArgumentException
*/
public function processArgs(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use Throwable;
use function array_slice;
use function count;
use function in_array;
use function method_exists;
Expand Down Expand Up @@ -152,6 +153,18 @@ public function getTypeFromMethodCall(
continue;
}

if ($lowerMethodName === 'set') {
try {
$args = $this->argumentsProcessor->processArgs($scope, $methodName, array_slice($calledMethodCall->getArgs(), 0, 1));
} catch (DynamicQueryBuilderArgumentException $e) {
return $defaultReturnType;
}
if (count($args) === 1) {
$queryBuilder->set($args[0], $args[0]);
continue;
}
}

if (!method_exists($queryBuilder, $methodName)) {
continue;
}
Expand Down
10 changes: 10 additions & 0 deletions tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,16 @@ public function testAndOrVariants(): void
$this->analyse([__DIR__ . '/data/query-builder-dql-and-or-variants.php'], []);
}

public function testUpdateIssue(): void
{
$this->analyse([__DIR__ . '/data/query-builder-dql-update.php'], [
[
'Could not analyse QueryBuilder with dynamic arguments.',
31,
],
]);
}

public function testBranchingPerformance(): void
{
$this->analyse([__DIR__ . '/data/query-builder-branches-performance.php'], [
Expand Down
40 changes: 40 additions & 0 deletions tests/Rules/Doctrine/ORM/data/query-builder-dql-update.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php declare(strict_types = 1);

namespace PHPStan\Rules\Doctrine\ORM;

use Doctrine\ORM\EntityManager;

class TestUpdateQueryBuilder
{

/** @var EntityManager */
private $entityManager;

public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}

public function nonDynamicSet(int $int, string $title): void
{
$this->entityManager->createQueryBuilder()
->update(MyEntity::class, 'e')
->set('e.title', $title)
->andWhere('e.id = :int')
->setParameter('int', $int)
->getQuery()
->execute();
}

public function dynamicSet(int $int, string $field, string $title): void
{
$this->entityManager->createQueryBuilder()
->update(MyEntity::class, 'e')
->set('e.' . $field, $title)
->andWhere('e.id = :int')
->setParameter('int', $int)
->getQuery()
->execute();
}

}

0 comments on commit 85def57

Please sign in to comment.