如何获得一维标量数组作为学说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());