You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中从复杂SQL查询获取列值数组的更优实现方法探讨

嘿,这个场景我太熟悉了!复杂原生SQL没法用Eloquent/查询构造器的时候,确实没必要写那么多冗余的函数调用,给你几个更简洁优雅的实现方案:

方案1:用Laravel数组辅助函数(仅2次函数调用,最推荐)

首先纠正一个小误区:DB::select()本身就支持直接传入原生SQL字符串,完全不需要额外套一层DB::raw()(DB::raw()主要是在查询构造器里拼接SQL片段时用的)。配合Laravel的Arr::pluck()辅助函数,一行就能搞定:

use Illuminate\Support\Arr;

$sql = <<<SQL
SELECT c.id FROM ...various joins / subqueries etc here
SQL;

$ids = Arr::pluck(DB::select($sql), 'id');

Arr::pluck()会直接从DB::select()返回的对象数组里提取id字段,返回结果就是你要的纯数值数组,整个过程只用到了两个函数调用,比原来的写法精简太多。

方案2:直接用PDO原生方法(3次函数调用,性能友好)

如果想完全绕开Laravel的集合/辅助函数,直接用PDO的原生能力也很高效:

$sql = <<<SQL
SELECT c.id FROM ...various joins / subqueries etc here
SQL;

$ids = DB::getPdo()->query($sql)->fetchAll(PDO::FETCH_COLUMN, 0);

通过指定PDO::FETCH_COLUMN模式,fetchAll()会一次性把结果集中第一列的所有值取出来,直接返回纯数组,没有中间转换步骤,性能上会有一点点优势(虽然大部分场景下可以忽略)。

方案3:简化你的集合写法(4次函数调用,兼容原有习惯)

如果你还是习惯用集合操作,也可以去掉多余的DB::raw(),把原来的5次函数调用减少到4次:

$ids = collect(DB::select($sql))->pluck('id')->toArray();

这只是对你原有写法的小优化,不如前两个方案精简,但胜在符合你已有的使用习惯。

总的来说,方案1是最平衡的选择——既简洁又符合Laravel的生态,推荐优先使用。

内容的提问来源于stack exchange,提问作者coatesap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:32:32