
本文介绍在 laravel 中使用 eloquent 查询时,通过 distinct() 方法快速过滤数据库结果中的重复值,避免相同字段(如 user_id)多次出现。
在 Laravel 开发中,当我们仅需获取某字段的唯一值(例如统计或下拉筛选场景),原始查询可能返回大量重复数据。例如:
$blog = BlogModel::select('user_id')->get();该语句会返回全部记录,包括重复的 user_id,如 [{"user_id":2},{"user_id":3},{"user_id":4},{"user_id":4},{"user_id":6}]。
要高效去重,推荐使用 Eloquent 提供的 distinct() 方法,它会直接在 SQL 层添加 SELECT DISTINCT,由数据库完成去重,性能优于 PHP 层处理:
$blog = BlogModel::select('user_id')->distinct()->get();执行后将得到去重后的结果:
[{"user_id":2},{"user_id":3},{"user_id":4},{"user_id":6}]
✅ 注意事项:
- distinct() 作用于 SELECT 的所有列;若 select() 中包含多个字段(如 select('user_id', 'status')),则只有整行完全相同才会被去重;
- 若仅需单一字段的唯一值(如纯 ID 列表),建议配合 pluck() 使用,更简洁高效:
$userIds = BlogModel::pluck('user_id')->unique(); // PHP 层去重(不推荐大数据量)
// ✅ 更优写法(数据库层去重 + 提取数组):
$userIds = BlogModel::distinct()->pluck('user_id');⚠️ 避免在 PHP 层用 collect($results)->unique('user_id') 处理大量数据——这会先加载全部记录到内存,造成性能浪费。
总结:优先使用 ->distinct()->get() 或 ->distinct()->pluck('field'),让数据库承担去重职责,兼顾简洁性与执行效率。










