当我执行这样的查询时,在原则 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
)
我在文档中找不到有关获取模式的任何信息。 我可以做一个数组图。但在我看来,这是开销。
模式参数传递给fetchAll()
。
$stmt->fetchAll(PDO::FETCH_COLUMN)
此答案已被编辑,因为此答案是正确的。
您可以在 fetchAll() 中使用 FETCH_COLUMN
获取模式:
$stmt->fetchAll(PDO::FETCH_COLUMN)
正如另一位用户在评论中指出的那样,fetchAll() 可以返回以多种有趣格式格式化的数据。
或者你可以使用 fetchColumn() 进行迭代:
while($page_url = $stmt->fetchColumn()) {
echo $page_url . PHP_EOL;
}
从 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;
如果你有多个需要这种结果形式的情况,虽然我也不太明白其中的含义,你可以实现AbstractHydrator接口来创建你自己的ArrayHydrator,根据需要返回结构。
水合类位于 NS:
DoctrineORMInternalHydration
fetchAll
在最新版本的 DBAL 中被弃用了。但是,我发现了另一种称为fetchFirstColumn
的方法,它似乎与fetchAll(PDO::FETCH_COLUMN)
执行相同的操作。我目前使用的是 2.11.1 版学说 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'
];
一旦您在数据库中请求多行,它就没有意义。
RDBMS 存储行和列,因此结果表示为行和列。
在编程世界中,它被称为矩阵,在PHP世界中,它被称为array
。
________________
| id | name |
|______|_________|
| 1 | foo |
|______|_________|
| 2 | bar |
|______|_________|
将导致
array(
0 => array(
'id' => 1,
'name' => 'foo',
),
1 => array(
'id' => 2,
'name' => 'foo',
)
);
所以不,你不能那样做,你宁愿处理结果以满足你的需求。