【问题标题】:Fetch multi-row, single-column array using Doctrine使用 Doctrine 获取多行单列数组
【发布时间】:2013-12-21 01:08:17
【问题描述】:

我有一个像这样的 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));

【问题讨论】:

  • 虽然不是最优雅的做事方式,但 call_user_func_array 确实可以按预期工作并正确展平单个 getArrayResult(如果只有一列)

标签: php mysql pdo doctrine doctrine-query


【解决方案1】:

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

$ids = $db
    ->executeQuery($query)
    ->fetchAll(\PDO::FETCH_COLUMN)
;

【讨论】:

    【解决方案2】:

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

    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. 最后你可以使用你的定制 hidrator 了:
    <?php
    $query = $em->createQuery('SELECT u FROM CmsUser u');
    $results = $query->getResult('CustomHydrator');
    

    【讨论】:

    • 我需要做同样的事情,我希望有人已经发布了他们的定制保湿剂,但我似乎找不到任何东西。你们中的任何一个人都完成了这项任务吗?
    【解决方案3】:

    我找到了一个名为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'
    ];
    

    【讨论】:

      【解决方案4】:

      使用 fetchAssoc 获取数据:

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

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

      Array ( 
          [id] => 11
      )
      

      【讨论】:

        猜你喜欢
        • 2017-09-13
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        相关资源
        最近更新 更多