phpstan-doctrine
phpstan-doctrine copied to clipboard
Support `AbstractQuery::getSingleScalarResult`
It appears that getSingleScalarResult() currently always returns bool|float|int|string|null.
If I have the following query:
$result = $this->createQueryBuilder('u')
->select('COUNT(u.id)')
->where('u.is_deleted = false')
->getQuery()
->getSingleScalarResult();
\PHPStan\assertType($result, 'bool|float|int|string|null');
But when I do getResult() it works properly:
$result = $this->createQueryBuilder('u')
->select('COUNT(u.id)')
->where('u.is_deleted = false')
->getQuery()
->getSingleScalarResult();
\PHPStan\assertType($result, 'list<array{1: int<0, max>}>');
I wonder why we cannot support getSingleScalarResult? I created the following helper:
/**
* @template TValue of scalar
* @param list<array{1: TValue}> $results
*
* @return TValue
*/
protected function getSingleScalarResult(array $results) : bool | float | int | string
{
return $results[0][array_key_first($results[0])];
}
And now this works great:
$result = $this->getSingleScalarResult($this->createQueryBuilder('u')
->select('COUNT(u.id)')
->where('u.is_deleted = false')
->getQuery()
->getResult());
\PHPStan\assertType($result, 'int<0, max>');
Am I being naive here and is there a flaw with my solution or would it be possible to support it 😁?
/cc @arnaud-lb @janedbal
References:
- https://github.com/phpstan/phpstan-doctrine/issues/276
Not as easy as it looks.
See
- https://github.com/phpstan/phpstan-doctrine/pull/520
- https://github.com/phpstan/phpstan-doctrine/pull/588
- Also https://github.com/phpstan/phpstan-doctrine/pull/592
I'd recommend using https://github.com/staabm/phpstan-dba additionally which resolves types much narrower for most queries.