使用 PDO 在结果中使用列的值作为索引

2022-08-31 00:39:13

我有一个名为“brands”的SQL表,其中包含列ID,名称,url。在该表中,我有以下数据集:

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

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


答案 1

虽然PHP手册中的描述相当不清楚,但实际上它就是你实际需要的确切参数PDO::FETCH_UNIQUE

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

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

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

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

答案 2

Fetch as assoc

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

fetch_style

控制 PDOStatement::fetch() 中记录的返回数组的内容。默认值为 PDO::ATTR_DEFAULT_FETCH_MODE(默认为 PDO::FETCH_BOTH)

若要从结果集中返回由单个列的所有值组成的数组,请指定 PDO::FETCH_COLUMN。您可以使用列索引参数指定所需的列。

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

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

最后一点是关键。它似乎没有完全记录(我可以找到),但是您可以代替PDO::FETCH_COLUMN,将PDO::FETCH_ASSOC与PDO::FETCH_GROUP组合在一起以获得所需的结果:

$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 语句中两次(即 ,等)。select id, brands.* from brands

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