如何在 Laravel 中使用 DISTINCT 去除数据库查询结果中的重复值

10次阅读

如何在 Laravel 中使用 DISTINCT 去除数据库查询结果中的重复值

laravel 中,可通过链式调用 `distinct()` 方法对 eloquent 查询结果去重,避免同一字段(如 `user_id`)出现重复记录,简洁高效地返回唯一值集合。

当你执行类似 $blog = BlogModel::select(‘user_id’)->get(); 的查询时,若数据库中存在多条 user_id 相同的记录,结果会包含重复项(例如 [{“user_id”:2},{“user_id”:3},{“user_id”:4},{“user_id”:4},{“user_id”:6}])。此时,只需在 select() 后添加 distinct() 即可实现去重:

$blog = BlogModel::select('user_id')->distinct()->get();

✅ 输出结果将变为:

[{"user_id":2},{"user_id":3},{"user_id":4},{"user_id":6}]

⚠️ 注意事项:

  • distinct() 作用于 所选字段的组合。若 select() 中包含多个字段(如 select(‘user_id’, ‘status’)),则只有当所有指定字段值完全相同时才会被去重;
  • 若仅需获取去重后的纯数值数组(如 [2, 3, 4, 6]),可进一步使用 pluck() 和 unique() 组合:
    $userIds = BlogModel::pluck('user_id')->unique()->values()->toArray();

    但更推荐直接使用 distinct() + pluck() 提升效率:

    $userIds = BlogModel::select('user_id')->distinct()->pluck('user_id')->toArray();
  • distinct() 是 sql 层面的去重(生成 SELECT DISTINCT user_id …),性能优于 php 层遍历过滤,尤其适合大数据量场景。

总之,distinct() 是 laravel 中处理字段级去重最标准、最高效的方式,应优先用于数据库查询阶段,而非在 PHP 中后处理。

text=ZqhQzanResources