
本文介绍如何通过设置 PDO 的 fetch mode 为 PDO::FETCH_COLUMN,将多列查询结果(如 SELECT DISTINCT extract(...))直接映射为简洁的一维数值数组,避免冗余键名结构。
本文介绍如何通过设置 pdo 的 fetch mode 为 pdo::fetch_column,将多列查询结果(如 select distinct extract(...))直接映射为简洁的一维数值数组,避免冗余键名结构。
在使用 PDO 执行 SQL 查询时,默认的 fetchAll() 行为会返回关联数组(如 ['date_part' => 2021]),这在仅需单列值的场景下显得冗余且增加后续处理成本。要直接获取纯数值的一维数组(例如 [2021, 2022]),关键在于显式指定 fetch mode —— 推荐使用 PDO::FETCH_COLUMN。
该模式指示 PDO 仅提取结果集中指定列索引(默认为第 0 列)的值,并以索引数组形式返回。对于你的原始代码:
$stmt = $this->pdo->prepare("SELECT DISTINCT EXTRACT(YEAR FROM conclusion) FROM agreements_register WHERE conclusion IS NOT NULL");
$stmt->execute();
return $stmt->fetchAll(); // ❌ 默认返回 [['date_part' => 2021], ['date_part' => 2022]]
只需在 fetchAll() 中传入 PDO::FETCH_COLUMN 即可实现目标:
$stmt = $this->pdo->prepare("SELECT DISTINCT EXTRACT(YEAR FROM conclusion) FROM agreements_register WHERE conclusion IS NOT NULL");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_COLUMN); // ✅ 返回 [2021, 2022]
? 原理说明:
EXTRACT(YEAR FROM ...)在 PostgreSQL 中默认别名为date_part,但PDO::FETCH_COLUMN会忽略字段名,只取每行第一列的标量值(即年份数字),自动跳过键名包装。
✅ 额外提示:
- 若需提取非首列,可使用
PDO::FETCH_COLUMN | PDO::FETCH_PROPS_LATE组合(不推荐)或改用PDO::FETCH_COLUMN + 列偏移,例如fetchAll(PDO::FETCH_COLUMN, 1)提取第 2 列; - 确保 SQL 查询确实只返回单列(如本例中无
AS year别名干扰逻辑,但即使有也无影响); - 该模式不支持同时获取关联键与值,如需键值对,请改用
PDO::FETCH_KEY_PAIR或手动array_column()转换。
综上,PDO::FETCH_COLUMN 是简化单列查询结果结构最直接、高效的方式,无需额外循环或 array_column() 处理,语义清晰且性能更优。










