How to get a one-dimensional scalar array as a doctrine dql query result? How to get a one-dimensional scalar array as a doctrine dql query result? php php

How to get a one-dimensional scalar array as a doctrine dql query result?


PHP < 5.5

You can use array_map, and since you only have on item per array, you can elegantly use 'current' as callback, instead of writing a closure.

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();$ids = array_map('current', $result);

See Petr Sobotka's answer below for additional info regarding memory usage.

PHP >= 5.5

As jcbwlkr's answered below, the recommended way it to use array_column.


As of PHP 5.5 you can use array_column to solve this

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();$ids = array_column($result, "id");


A better solution is to use PDO:FETCH_COLUMN . To do so you need a custom hydrator:

//MyProject/Hydrators/ColumnHydrator.phpnamespace DoctrineExtensions\Hydrators\Mysql;use Doctrine\ORM\Internal\Hydration\AbstractHydrator, PDO;class ColumnHydrator extends AbstractHydrator{    protected function hydrateAllData()    {        return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);    }}

Add it to Doctrine:

$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProject\Hydrators\ColumnHydrator');

And you can use it like this:

$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");

More info:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes