Skip to content

Support AbstractQuery::getSingleScalarResult #611

Open
@ruudk

Description

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:

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions