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->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() 不必要的数组维度的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2.8(Wamp):[Doctrine\DBAL\Exception\ConnectionException] PDOException:SQLSTATE[HY000] [2002]