如何利用PDO获取以ID为键的对象数组?
嘿,这个需求我刚好实操过,给你几个简单好用的方案:
方案1:一步到位的简洁写法
如果你想直接得到以ID为键的stdClass对象数组,可以组合使用PDO::FETCH_UNIQUE和PDO::FETCH_OBJ两个常量:
$temp = $sth->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_OBJ);
原理很简单:
PDO::FETCH_UNIQUE会把结果集的第一列(也就是你的id列)作为数组的键PDO::FETCH_OBJ会将每一行数据转换成标准的stdClass对象
这样组合起来,直接就能得到你想要的结构:[11 => stdClass{id:11, title:'t1'}, 12 => stdClass{id:12, title:'t2'}]
方案2:兼容非首列ID的写法
如果你的id列不是查询结果的第一列(比如查询语句是SELECT title, id FROM ...),那可以用PDO::FETCH_GROUP配合array_map,把原来的FETCH_ASSOC换成FETCH_OBJ即可:
$temp = array_map(function($v){return $v[0];}, $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_OBJ));
这里PDO::FETCH_GROUP会按第一列分组,我们通过array_map提取每个分组里的第一个对象,同样能得到以ID为键的对象数组。
方案3:获取自定义类的对象数组
要是你不想用默认的stdClass,而是想得到自定义类的对象(比如Post类),可以搭配PDO::FETCH_CLASS:
首先定义你的类:
class Post { public $id; public $title; }
然后用下面的代码获取:
$temp = $sth->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_CLASS, 'Post');
这样得到的数组里,每个值都是Post类的实例,属性会自动对应结果集的字段。
内容的提问来源于stack exchange,提问作者Sławomir Kudła
相关产品推荐
相关产品推荐

