18

在 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
)

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

4

6 回答 6

32

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

$stmt->fetchAll(\PDO::FETCH_COLUMN)
于 2015-04-16T12:33:39.830 回答
9

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

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

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

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

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

while($page_url = $stmt->fetchColumn()) { 
    echo $page_url . PHP_EOL;
}
于 2012-12-13T22:34:03.090 回答
4

从 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;
于 2015-02-11T10:44:08.780 回答
2

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

水合课程位于 NS:

Doctrine\ORM\Internal\Hydration
于 2012-09-20T09:58:45.740 回答
2

看起来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'
];
于 2020-12-03T16:02:42.897 回答
0

一旦您在数据库中请求多行,它就没有意义。

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

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

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

将导致

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

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

于 2012-09-20T09:46:35.913 回答