
本文介绍在 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,由数据库引擎完成去重,性能高效且语义清晰。
将一个或多个 UI 原型图、线框图、产品截图或设计稿转换为标准化、可直接交付的 PRD 风格文档,供产品、设计、前端和测试共同使用。适用于 Codex 需要分析 PC 网页、桌面端、移动端、响应式页面、独立弹窗、表单、表格、看板、数据大屏或多页面流程截图,还原页面结构与交互,强制套用固定文档模板,抽取跨页面共享规则,或把一组原型沉淀为单页规范文档加整体业务流程文档的场景。不适用于纯视觉审美点评、代码实现、接口设计、埋点方案、竞品分析或无 UI 输入的业务需求创作。
⚠️ 注意事项:
- 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() 是最简洁、标准且数据库友好的解决方案。合理运用它,可显著提升查询效率与数据准确性。

















