
本文介绍在 laravel 中使用 distinct() 方法过滤数据库查询结果,避免返回重复值,特别适用于只需获取唯一字段(如 user_id)的场景。
在 Laravel 的 Eloquent 查询中,当需要从数据库中提取某字段的唯一值(例如获取所有有博客文章的用户 ID),而原始数据存在重复时,直接调用 get() 会返回包含重复项的结果集。此时,不应依赖 PHP 层去重(如 array_unique() 或集合的 unique()),而应优先利用数据库的原生能力——DISTINCT 关键字,既高效又语义清晰。
Laravel 提供了链式方法 distinct(),可直接追加在查询构造器后,确保 SQL 语句中生成 SELECT DISTINCT。例如:
$blog = BlogModel::select('user_id')->distinct()->get();执行后将返回:
[{"user_id":2},{"user_id":3},{"user_id":4},{"user_id":6}]✅ 优势说明:
- 数据库层面去重,减少网络传输与 PHP 内存开销;
- 语义明确,代码可读性强;
- 支持与其他查询条件组合,如:
$activeUserIds = BlogModel::where('status', 'published') ->select('user_id') ->distinct() ->get();
⚠️ 注意事项:
- distinct() 作用于整个 SELECT 列表,若同时选择多个字段(如 select('user_id', 'created_at')),则仅当所有选定字段组合完全相同时才视为重复;
- 若仅需纯数值数组(如 [2, 3, 4, 6]),可进一步使用 pluck('user_id'):
$userIds = BlogModel::select('user_id')->distinct()->pluck('user_id'); // 返回 Illuminate\Support\Collection: [2, 3, 4, 6]
综上,distinct() 是处理去重需求最直接、最推荐的 Laravel 官方方案,兼顾性能、简洁性与可维护性。










