
本文介绍在 laravel eloquent 中使用 distinct() 方法高效过滤查询结果,避免重复数据,特别适用于仅需去重字段(如 user_id)的场景。
在 Laravel 开发中,当我们执行类似 $blog = BlogModel::select('user_id')->get(); 的查询时,若数据库中存在多条记录具有相同的 user_id,Eloquent 会原样返回所有匹配行,导致结果集中出现重复值(例如 [{"user_id":4}, {"user_id":4}])。这不仅增加传输和处理开销,还可能引发前端展示或业务逻辑异常。
要彻底解决该问题,推荐在查询构建阶段就进行去重——使用 Eloquent 提供的 distinct() 方法:
$blog = BlogModel::select('user_id')->distinct()->get();✅ 该写法会在 SQL 层生成 SELECT DISTINCT user_id FROM blogs,由数据库引擎完成去重,性能高效且语义清晰。
⚠️ 注意事项:
- distinct() 作用于整个 SELECT 字段组合。若你后续需 select('user_id', 'title'),则只有当 user_id 和 title 同时完全相同时才视为重复;若仅想按 user_id 去重并保留任意一条关联数据(如最新的一条),应改用 groupBy('user_id') 配合聚合函数(如 MAX(created_at))或结合子查询;
- 若需获取每个 user_id 对应的完整博客记录(而非仅 ID),建议使用 ->distinct('user_id')(Laravel 10.28+ 支持)或更稳健的方式:->groupBy('user_id')->latest('created_at')->first()(需配合 orderBy 或窗口函数确保一致性);
- distinct() 不影响模型事件(如 retrieved),但会跳过重复模型实例的初始化,因此内存占用更低。
总结:对于纯字段去重需求,distinct() 是最简洁、标准且数据库友好的解决方案。合理运用它,可显著提升查询效率与数据准确性。










