
本文介绍在 laravel 中将 eloquent 查询结果中某个字段(如 id)批量提取为纯数值数组的最优实践,重点对比手动 foreach 循环与内置 pluck() 方法的性能与可读性差异。
本文介绍在 laravel 中将 eloquent 查询结果中某个字段(如 id)批量提取为纯数值数组的最优实践,重点对比手动 foreach 循环与内置 pluck() 方法的性能与可读性差异。
在 Laravel 开发中,经常需要从数据库查询一批模型记录,但实际仅需其中某一字段(例如 id)构成的纯数组。例如,原始查询返回的是对象集合:[{"id":"5"},{"id":"76"},{"id":"33"}],而业务逻辑期望的是简洁的整数数组:[5, 76, 33]。
你可能最初会采用 foreach 遍历 + 手动推入数组的方式,如下所示:
$UserNot = [2, 3];
$allverified = [];
$verified = App\Models\User::whereNotIn('id', $UserNot)
->select('id')
->where('role', 'verified')
->get()
->take(5);
foreach ($verified as $veribadge) {
$allverified[] = (int) $veribadge->id; // 注意类型转换
}该写法虽能工作,但存在明显缺陷:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- ❌ 性能冗余:get() 实例化完整模型对象,即使只用 id 字段;
- ❌ 内存开销大:加载全部模型属性(如 name, email, created_at 等),浪费资源;
- ❌ 代码冗长:需额外循环和数组操作,可读性与维护性较低;
- ⚠️ 类型隐患:数据库中 id 若为字符串(如 UUID 或字符串型主键),未显式转换可能导致后续逻辑异常。
✅ 推荐方案:使用 pluck() + toArray()
Laravel 提供了专为此类场景设计的 pluck() 方法,它直接从查询结果中提取指定列,并返回 Laravel 的 Collection;配合 toArray() 即可获得标准 PHP 数组:
$UserNot = [2, 3];
$allverified = App\Models\User::query()
->whereNotIn('id', $UserNot)
->where('role', 'verified')
->pluck('id') // ← 仅查询并提取 'id' 字段(底层生成 SELECT id ...)
->take(5) // ← 在 Collection 层截取前5项(若需数据库层限制,改用 limit(5))
->toArray(); // ← 转为纯 PHP 数组:[5, 76, 33]? 进阶提示:
- 若需数据库层面分页/限制(更高效),请将 take(5) 替换为 limit(5),即在 SQL 中加 LIMIT 5;
- pluck('id') 返回的值默认保持数据库原始类型(如整型或字符串),无需额外 (int) 强转,语义更清晰;
- 支持链式调用,可无缝衔接 map()、filter() 等 Collection 方法进行进一步处理;
- 对于关联字段(如 user.profile.name),pluck() 同样支持点号语法:pluck('profile.name')(需确保关系已加载或使用 with())。
总结:避免“先取全量模型再遍历取字段”的反模式,优先使用 pluck()——它更简洁、更高效、更符合 Laravel 的设计哲学。

















