phpstan / phpstan-doctrine

Doctrine extensions for PHPStan
MIT License
583 stars 96 forks source link

Incorrect PHPStan Error for Method Return Type Declaration #544

Open bedfir opened 7 months ago

bedfir commented 7 months ago

Hi All,

I encountered an issue where PHPStan threw an incorrect error regarding method return type declaration. Here's the scenario:

Problem: I have a method getData() in my codebase which fetches data from the database and returns an array of associative arrays. The return type declaration of this method is specified accurately. However, PHPStan still throws this error suggesting that the return type is incorrect.

 Method                                                                                                           

         App\Repository\FakeRepository::getData()  

         should return array<array{key1: string, key2: string, key3: string,                   
         key4: int, key5: int}> but returns array.  
/**
 * @return array<array{
 *     "key1": string,
 *     "key2": string,
 *     "key3": string,
 *     "key4": int,
 *     "key5": int
 * }>
 */
public function getData(): array
{
    $result = $this->createQueryBuilder('a')
        ->select(.....)
        ->where('a.status = :validated')
        ->groupBy(.....)
        ->setParameter('validated', Status::VALIDATED);

    return $result
        ->getQuery()
        ->getArrayResult();
}

Additional Information: "php": ">=8.3", "phpstan/extension-installer": "^1.3.1", "phpstan/phpstan": "^1.10.47", "phpstan/phpstan-deprecation-rules": "^1.1.4", "phpstan/phpstan-doctrine": "^1.3.53", "phpstan/phpstan-phpunit": "^1.3.15", "phpstan/phpstan-symfony": "^1.3.5",

Thank you for your attention to this matter. Please let me know if you need any further information or clarification.

ondrejmirtes commented 7 months ago

Please make sure you have the latest versions of PHPStan and phpstan-doctrine installed. And please make sure you have configured objectManagerLoader. See the README here.

VincentLanglet commented 7 months ago

I think this is because getArrayResult is not supported yet. You may avoid the issue with getResult() until https://github.com/phpstan/phpstan-doctrine/pull/520 is merged.

ThomasLandauer commented 2 weeks ago

520 is now merged, but I'm still seeing this issue.

In short:

/**
 * @return array<int, array{'id': int}>
 */
public function foo(): array
{
    $queryBuilder = $this->createQueryBuilder('e')
    $queryBuilder->select('e.id');
    return $queryBuilder->getQuery()->getArrayResult();
}

PHPStan is reporting:

Method ... should return array<int, array{id: int}> but returns array.

ondrejmirtes commented 2 weeks ago

@ThomasLandauer getArrayResult has been reverted again in phpstan-doctrine 1.4.4.

ThomasLandauer commented 2 weeks ago

OK, so the relevant PR is now https://github.com/phpstan/phpstan-doctrine/pull/593 ?

ondrejmirtes commented 2 weeks ago

Yes

VincentLanglet commented 2 weeks ago

Currently you can resolve your issue by using getResult

/**
 * @return array<int, array{'id': int}>
 */
public function foo(): array
{
    $queryBuilder = $this->createQueryBuilder('e')
    $queryBuilder->select('e.id');
    return $queryBuilder->getQuery()->getResult();
}