如何得到一个一维标量数组作为原则 dql 查询结果?

我想从 Auction 表的 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
)

我怎样才能用信条做到这一点呢?

91849 次浏览

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

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

PHP < 5.5

您可以使用 array_map,并且由于您只对每个数组的项目使用,因此您可以优雅地使用 'current'作为回调函数,而不是编写 了结

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

有关内存使用的其他信息,请参见 下面是彼得 · 索博特卡的回答

PHP > = 5.5

作为 Jcbwlkr 的回答如下,推荐使用 array_column的方法。

阿斯卡利斯的回答很优雅,但是要小心内存的使用!array_map()创建传递数组的副本,有效地使内存使用量加倍。如果使用数十万个数组项,这可能会成为一个问题。因为 PHP 5.4的调用时间通过引用已经被删除,所以您不能这样做

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

这样的话,你可以用“显而易见”这个词

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

从 PHP 5.5开始,您可以使用 Array _ column来解决这个问题

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

一个更好的解决方案是使用 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);
}
}

将其加入教义:

$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

自从学说/orm 2.10.0以来,有一个内置的解决方案:

use Doctrine\ORM\AbstractQuery;


$query = $em->createQuery("SELECT a.id FROM Auction a");
return $query->getSingleColumnResult();
// Same as:
return $query->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN);

医生: https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/dql-doctrine-query-language.html#scalar-column-hydration