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

时间:2012-09-20 09:09:23

标签: php pdo doctrine-orm dbal

当我执行这样的查询时,在doctrine 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
)

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

6 个答案:

答案 0 :(得分:24)

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

$stmt->fetchAll(PDO::FETCH_COLUMN)

答案 1 :(得分:8)

这个答案已被编辑,因为Docal是对的,有人在评论中指出了它。

您可以使用FETCH_COLUMN获取模式来获取fetchAll():

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

用户'你的常识'指出,fetchAll()可以返回以多种有趣格式格式化的数据。

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

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

答案 2 :(得分:2)

如果您有多个案例需要这种形式的结果,虽然我也不太了解这种意义,但您可以实现AbstractHydrator接口来创建自己的ArrayHydrator,它可以根据需要返回结构。

水合作用类位于NS:

Doctrine\ORM\Internal\Hydration

答案 3 :(得分:1)

从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;

答案 4 :(得分:1)

在最新版本的DBAL中,似乎已弃用了when(Address::category) { is AddressCategory.MAIN -> AddressCategory.MAIN.toString() is AddressCategory.DELIVERY -> AddressCategory.DELIVERY.toString() is AddressCategory.BILLING -> AddressCategory.BILLING.toString() } 。但是,我发现了另一个名为fetchAll的方法,该方法似乎与fetchFirstColumn的作用相同。我目前正在使用2.11.1 Doctrine DBAL版本。

我在Symfony中像这样使用它:

fetchAll(\PDO::FETCH_COLUMN)

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

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

答案 5 :(得分:0)

只要您在数据库中请求多行,就不会有意义。

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

在编程世界中它被称为matrice,在PHP世界中它是array

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

将导致

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

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