如何获得一维标量数组作为学说dql查询结果?

我想从拍卖表的id列获得一个值的数组。 如果这是一个原始的SQL,我会写:

SELECT id FROM auction 

但是当我在教义中这样做,并执行:

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

我得到这样一个数组:

 array( array('id' => 1), array('id' => 2), ) 

相反,我想获得一个这样的数组:

 array( 1, 2 ) 

我怎样才能使用教义?

PHP <5.5

你可以使用array_map ,因为你只有每个数组的项目,你可以优雅地使用'current'作为callback,而不是写闭包 。

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

有关内存使用情况的更多信息,请参阅下面的Petr Sobotka的回答 。

PHP> = 5.5

由于jcbwlkr的回答如下 ,build议使用array_column

从PHP 5.5开始,你可以使用array_column来解决这个问题

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

更好的解决scheme是使用PDO:FETCH_COLUMN 。 要做到这一点,你需要一个自定义的水化器:

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

添加到Doctrine:

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

你可以像这样使用它:

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

更多信息: http : //docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes

Ascarius的答案是优雅的,但要小心内存使用! array_map()创build一个传递数组的副本,并有效地增加内存使用量。 如果你使用数十万个数组项目,这可能成为一个问题。 由于PHP 5.4的调用时间通过引用已被删除,所以你不能这样做

 // note the ampersand $ids = array_map('current', &$result); 

在这种情况下,你可以明显地去

 $ids = array(); foreach($result as $item) { $ids[] = $item['id']; } 

我认为在教义上是不可能的。 只需要使用PHP将结果数组转换为您想要的数据结构:

 $transform = function($item) { return $item['id']; }; $result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());