如何将DB::select()返回的对象数组转为数组数组?
解决方案:将Laravel原生查询的对象数组转为纯数组数组
针对你遇到的Laravel原生查询返回stdClass对象数组,想要转为纯关联数组数组的需求,尤其是大数据集下的性能问题,这里有几个更高效的处理方式:
1. 直接让查询返回关联数组(最优解)
不需要后续转换,直接让PDO以关联数组格式返回结果,这是性能最高的方案——跳过了对象实例化和转换的额外开销:
// 原生查询时指定PDO获取模式为FETCH_ASSOC $data = DB::select('SELECT v FROM your_table', [], \PDO::FETCH_ASSOC);
这样$data直接就是你想要的array:999 [0 => ["v" => 1], ...]格式,完全不需要额外处理,大数据集下的性能提升非常明显。
2. 优化现有转换方式(如果必须处理对象数组)
如果因为某些原因无法修改查询的获取模式,你的foreach和array_map方法其实已经是PHP里比较高效的方式了,但可以用PHP内置函数简化array_map的写法:
$arr = array_map('get_object_vars', $data);
get_object_vars()是原生内置函数,比自定义匿名函数的性能略好一点,但本质上和你原来的方法差异不大,还是不如直接指定PDO模式高效。
补充说明
- Laravel的
DB::select()默认使用PDO::FETCH_OBJ模式返回stdClass对象,手动指定PDO::FETCH_ASSOC就能直接得到关联数组。 - 如果是使用查询构造器而非原生SQL,也可以直接调用
->get()->toArray()来得到数组数组,但原生查询场景下,指定PDO模式是更直接的方案。
内容的提问来源于stack exchange,提问作者Tarasovych
相关产品推荐
相关产品推荐

