【问题标题】:Using value of a column as index in results using PDO使用 PDO 将列的值用作结果中的索引
【发布时间】:2012-10-01 18:55:01
【问题描述】:

我有一个名为“brands”的 SQL 表,其中包含 id、name、url 列。 在那个表中,我有这个数据集:

1, Solidfloor, solidfloor;
2, Quickstep, quickstep;
4, Cleanfloor, cleanfloor;
5, Blue Dolphin, blue-dolphin;
6, Krono, krono;
8, Meister, meister;

我现在正在获取它们,并得到一个不错的数组作为回报,但是,我需要数组的索引不是递增的数字,而是该特定行的 id。我当然可以循环遍历结果集,但是有没有更简洁的方法呢?

【问题讨论】:

    标签: php sql arrays pdo


    【解决方案1】:

    虽然PHP手册中PDO::FETCH_UNIQUE的描述不太清楚,但实际上是exact parameter you actually need

    $data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE);
    

    首先为您提供一个由 SELECT 子句中列出的字段索引的数组(当使用 * 时,然后是表定义中的第一个字段,在您的情况下应该是 id)。

    请注意,默认情况下,仅使用 PDO::FETCH_UNIQUE 将为您提供具有双倍值的结果行。您可以向此调用添加首选行模式,或者 - 更好的是,为构造函数中的所有 PDO 调用或通过setAttribute() 设置一次。下面的输出显示PDO::FETCH_ASSOC 设置为默认获取模式。

      1 => array (
        'name' => 'Solidfloor',
        'url' => 'solidfloor',
      ),
      2 => array (
        'name' => 'Quickstep',
        'url' => 'quickstep',
      ),
      4 => array (
        'name' => 'Cleanfloor',
        'url' => 'cleanfloor',
      ),
    )
    

    【讨论】:

    • 优于 $pdo->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)
    • 当然。 FETCH_GROUP 会给你一个额外的嵌套级别。顾名思义,FETCH_GROUP 对唯一值毫无意义。
    【解决方案2】:

    作为关联获取

    对于手册: http://php.net/manual/en/pdostatement.fetchall.php

    fetch_style

    控制返回数组的内容,如 PDOStatement::fetch() 中所述。默认为 PDO::ATTR_DEFAULT_FETCH_MODE 的值(默认为 PDO::FETCH_BOTH)

    要返回由结果集中单个列的所有值组成的数组,请指定 PDO::FETCH_COLUMN。您可以使用 column-index 参数指定您想要的列。

    要从结果集中仅获取单个列的唯一值,请按位或 PDO::FETCH_COLUMN 与 PDO::FETCH_UNIQUE。

    要返回按指定列的值分组的关联数组,请按位或 PDO::FETCH_COLUMN 与 PDO::FETCH_GROUP。

    最后一点是关键。它似乎没有完整的文档记录(我可以找到),但是您可以将 PDO::FETCH_ASSOC 与 PDO::FETCH_GROUP 结合起来,而不是 PDO::FETCH_COLUMN,以实现所需的结果:

    $PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)
    

    所以,鉴于以上数据:

    $stmt = $PDO_obj->prepare('select * from brands');
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
    d($result);
    

    结果:

    array (6) [
        '1' => array (1) [
            array (2) [
                'name' => string (10) "Solidfloor"
                'url' => string (10) "solidfloor"
            ]
        ]
        '2' => array (1) [
            array (2) [
                'name' => string (9) "Quickstep"
                'url' => string (9) "quickstep"
            ]
        ]
        '4' => array (1) [
            array (2) [
                'name' => string (10) "Cleanfloor"
                'url' => string (10) "cleanfloor"
            ]
        ]
        '5' => array (1) [
            array (2) [
                'name' => string (12) "Blue Dolphin"
                'url' => string (12) "blue-dolphin"
            ]
        ]
        '6' => array (1) [
            array (2) [
                'name' => string (5) "Krono"
                'url' => string (5) "krono"
            ]
        ]
        '8' => array (1) [
            array (2) [
                'name' => string (7) "Meister"
                'url' => string (7) "meister"
            ]
        ]
    ]
    

    ( d() 只是 kint 库中一个方便的调试函数,如 var_dump() 或 print_r() )

    请注意,用于索引数组的列将始终是结果中的第一列,因此您可以修改您的 select 语句以选择您想要的列。还要注意,索引列将从每一行的数组中删除;为了解决这个问题,您可以将该列两次添加到您的选择语句中(即select id, brands.* from brands 等)。

    这里记录了更多参数:http://php.net/manual/en/pdostatement.fetch.php,例如 PDO::FETCH_UNIQUE 以确保每个索引只使用一次。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多