
本文介绍在 Laravel 中将 Eloquent 查询结果快速转换为纯 ID 数组的两种方式,重点推荐使用 pluck() 方法替代手动 foreach 循环,提升性能与代码简洁性。
本文介绍在 laravel 中将 eloquent 查询结果快速转换为纯 id 数组的两种方式,重点推荐使用 `pluck()` 方法替代手动 foreach 循环,提升性能与代码简洁性。
在 Laravel 开发中,经常需要从数据库查询一批模型并仅提取某个字段(如 id)组成纯数值或字符串数组。例如,你希望从 User 模型中筛选出非指定 ID 且角色为 verified 的用户,并最终得到形如 [5, 76, 33] 的整数数组——而非默认返回的 Eloquent 对象集合 [{ "id": "5" }, { "id": "76" }, ...]。
你当前采用的手动遍历方式虽逻辑正确,但存在明显不足:
$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; // 注意:还需类型转换以确保整数
}
该写法的问题在于:
- 调用 get() 会实例化完整的 Eloquent 模型对象,即使你只用到 id 字段;
- take(5) 在集合层面执行(即先查出所有匹配记录再截取),而非 SQL 层限制,效率低下;
- 需额外循环 + 类型转换,代码冗长且易出错。
✅ 推荐方案:使用 pluck() + toArray()
pluck() 是 Laravel 提供的链式方法,直接从查询结果中提取指定字段值,并返回一个 Collection;调用 toArray() 即可获得 PHP 索引数组,且自动处理类型(数据库中 id 为整型时,结果亦为 int):
$UserNot = [2, 3];
$allverified = App\Models\User::query()
->whereNotIn('id', $UserNot)
->where('role', 'verified')
->pluck('id') // ← 直接提取 id 列,不实例化模型
->take(5) // ← 在 Collection 层截取(若需 SQL 层分页,请用 `limit(5)`)
->toArray(); // ← 转为纯 PHP 数组:[5, 76, 33]
⚠️ 进阶提示:
- 若需在数据库层面限制条数(更高效),应使用 limit(5) 替代 take(5):
->limit(5)
- 若字段可能为 NULL 或需强制整型,可结合 map() 处理:
->pluck('id') ->map(fn($id) => (int) $id) ->toArray() - pluck() 返回的 Collection 支持链式操作(如 filter()、unique()),灵活性远超原始数组。
总结:优先使用 pluck('field')->toArray() 替代手动遍历,既减少内存开销、提升查询效率,又使代码更简洁、可读性更强,是 Laravel 数据提取的标准实践。











