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

bcs8qyzn  于 2022-11-28  发布在  PHP
关注(0)|答案(6)|浏览(146)

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

SELECT id FROM auction

但当我在Doctrine中这样做并执行时:

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

我得到一个数组,如下所示:

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

相反,我想得到一个如下的数组:

array(
    1,
    2
)

我如何使用Doctrine实现这一点?

cetgtptt

cetgtptt1#

PHP〈5.5
可以使用array_map,因为每个数组只有一个item,所以可以优雅地使用'current'作为回调函数,而不是编写closure

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

有关内存使用的其他信息,请参阅Petr Sobotka's answer below

PHP〉= 5.5

作为jcbwlkr's answered below,推荐它使用array_column的方式。

bkkx9g8r

bkkx9g8r2#

从PHP 5.5开始,您可以使用array_column来解决此问题

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

7fyelxc53#

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

uoifb46i

uoifb46i4#

Ascarius的回答很优雅,但是要注意内存使用!array_map()创建了一个传递数组的副本,有效地加倍了内存使用。如果你处理几十万个数组项,这可能会成为一个问题。由于PHP 5.4调用时引用传递已经被删除,所以你不能

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

这样的话你可以用明显的

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

yizd12fk5#

从doctrine/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

dldeef67

dldeef676#

我认为这在Doctrine中是不可能的。只需使用PHP将result数组转换为您想要的数据结构即可:

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

相关问题