9

我有一个像这样的 Doctrine fetch 语句

$query = "SELECT id FROM table LIMIT 2";
$result = $db->fetchAll($query);

它返回这样的数组:

Array
(
[0] => Array
    (
        [id] => 1
    )

[1] => Array
    (
        [id] => 2
    )
)

由于我获取的唯一列是 ID,因此我不需要数组范围那么深。有没有一种方便的方法可以让 Doctrine 在“平面”数组中返回结果,类似于 PDO 所做的:

$result = $db->query($query)->fetchAll(PDO::FETCH_COLUMN);

将返回

Array
(
    [0] => 1
    [1] => 2
)

目前我正在使用

$result = call_user_func_array('array_merge', array_map("array_values", $result));
4

4 回答 4

12

您可以简单地使用 PDO 功能(至少如果您有 MySQL)。

$ids = $db
    ->executeQuery($query)
    ->fetchAll(\PDO::FETCH_COLUMN)
;
于 2015-07-28T14:10:49.810 回答
6

要解决此问题,您必须制作自定义的学说水合器。

  1. 第一:制作自己的保湿剂
<?php
namespace MyProject\Hydrators;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator;

class CustomHydrator extends AbstractHydrator
{
    protected function _hydrateAll()
    {
        return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
    }
}
  1. 将您的 hydrator 添加到 Doctrine 配置文件中:
<?php
$em->getConfiguration()->addCustomHydrationMode('CustomHydrator','MyProject\Hydrators\CustomHydrator');
  1. 最后你可以使用你的 cutom hidrator :
<?php
$query = $em->createQuery('SELECT u FROM CmsUser u');
$results = $query->getResult('CustomHydrator');
于 2013-12-05T00:00:51.713 回答
2

我找到了一个fetchFirstColumn似乎可以做到这一点的方法。这可能是在更高版本的学说中添加的。我目前正在使用 Doctrine ORM 2.7.4。

我在 Symfony 中这样使用它:

$statement = $connection->prepare('SELECT foo FROM bar WHERE baz = :baz');
$statement->execute([':baz' => 1]);
$result = $statement->fetchFirstColumn();

$result 的值将是一个从 0 开始的数字索引数组,如下所示:

[
    0 => 'foo1', 
    1 => 'foo2'
];
于 2020-12-03T04:08:33.493 回答
0

使用 fetchAssoc 获取数据:

$result = $db->query($query)->fetchAssoc(PDO::FETCH_COLUMN);

你会得到一个这样的数组:

Array ( 
    [id] => 11
)
于 2019-04-11T13:21:37.130 回答