Doctrine DBAL 2:fetchAll() 不必要的数组维度

Posted

技术标签:

【中文标题】Doctrine DBAL 2:fetchAll() 不必要的数组维度【英文标题】:Doctrine DBAL 2: fetchAll() unnecessary array dimensions 【发布时间】:2012-09-12 15:09:27 【问题描述】:

当我执行这样的查询时,在教义 DBAL2 中:

<?php
$connection = $this->getDatabaseConnection();

$sql =  "SELECT page_url
           FROM cms_user_page
          WHERE site_id = :siteid
            AND active = '1'
    ";

$stmt = $connection->prepare($sql);
$stmt->bindValue("siteid", $id);
$stmt->execute(); 

return $stmt->fetchAll();
?>

我得到这样的结果:

Array
(
    [0] => Array
        (
            [page_url] => index.php?action=login
        )

    [1] => Array
        (
            [page_url] => index.php?action=shoppingcart
        )

    [2] => Array
        (
            [page_url] => index.php?action=products
        )
)

我的问题是,是否有一种获取模式会产生这样的结果:

Array
(
    [0] => index.php?action=login

    [1] => index.php?action=shoppingcart

    [2] => index.php?action=products
)

我在文档中找不到任何有关获取模式的信息。我可以做一个数组映射。但在我看来,这是开销..

【问题讨论】:

【参考方案1】:

您可以将获取模式参数传递给fetchAll()

$stmt->fetchAll(\PDO::FETCH_COLUMN)

【讨论】:

虽然这可能会回答这个问题,但在您的答案中加入一些文字来解释您在做什么总是一个好主意。阅读how to write a good answer。【参考方案2】:

此答案已被编辑,因为this answer 是正确的。

您可以在 fetchAll() 中使用FETCH_COLUMN fetch 模式:

$stmt->fetchAll(\PDO::FETCH_COLUMN)

正如另一位用户在 cmets 中指出的那样,fetchAll() 可以返回以多种有趣格式格式化的数据。

或者您可以使用 fetchColumn() 进行迭代:

while($page_url = $stmt->fetchColumn())  
    echo $page_url . PHP_EOL;

【讨论】:

没有充分的理由,实际上fetchAll() can return the data in dozens different formats。 编辑了我的答案,因为你完全正确。 一旦我在 PDO 之前添加了“\”,这对我有用。 “timdev”在他的答案中有它,但在上面标记为选定答案的答案中缺少它。只是提醒其他人,因为这让我有点想明白。【参考方案3】:

从 PHP5.5 开始,您可以使用 aray_column 来实现所需的结果,如下所示:

<?php
$connection = $this->getDatabaseConnection();

$sql =  "SELECT page_url
           FROM cms_user_page
          WHERE site_id = :siteid
            AND active = '1'
    ";

$stmt = $connection->prepare($sql);
$stmt->bindValue("siteid", $id);
$stmt->execute(); 
$data = array_column($stmt->fetchAll(), 'page_url');

return $data;

【讨论】:

如果您使用 DBAL $arr = array_column($db-&gt;fetchAll('SELECT id FROM foo'), 'id') 语法也很方便。【参考方案4】:

如果你有不止一种情况需要这种形式的结果,虽然我也不太明白其中的含义,但你可以实现 AbstractHydrator 接口来创建你自己的 ArrayHydrator,它会根据需要返回结构。

Hydration Classes 驻留在 NS 中:

Doctrine\ORM\Internal\Hydration

【讨论】:

【参考方案5】:

看起来fetchAll 在最新版本的 DBAL 中已被弃用。但是我发现了另一种名为fetchFirstColumn 的方法,它似乎与fetchAll(\PDO::FETCH_COLUMN) 做同样的事情。我目前使用的是 2.11.1 Doctrine DBAL 版本。

我在 Symfony 中这样使用它:

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

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

[
    0 => 'foo1', 
    1 => 'foo2'
];

【讨论】:

【参考方案6】:

当您在数据库中请求多行时,它没有意义

RDBMS 存储行和列,因此它表示的结果为,惊喜,行和列。

在编程世界中称为矩阵,在 PHP 世界中称为array

 ________________
| id   |   name  |
|______|_________|
| 1    |   foo   |
|______|_________|
| 2    |   bar   |
|______|_________|

将导致

array(
  0 => array(
     'id'   => 1,
     'name' => 'foo',
  ),
  1 => array(
     'id'   => 2,
     'name' => 'foo',
  )
);

所以不,你不能这样做,你宁愿处理结果以满足你的需要。

【讨论】:

以上是关于Doctrine DBAL 2:fetchAll() 不必要的数组维度的主要内容,如果未能解决你的问题,请参考以下文章

更新或插入方法中的 Doctrine 2 DBAL 表达式

Symfony 2.8(Wamp):[Doctrine\DBAL\Exception\ConnectionException] PDOException:SQLSTATE[HY000] [2002]

composer安装doctrine/dbal

Doctrine DBAL、diff 命令和枚举类型

学说:ORM QueryBuilder 或 DBAL QueryBuilder

如何使用 Doctrine DBAL?