Laravel模型查询去重,distinct方法如何高效使用?

2026-04-29 03:220阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1055个文字,预计阅读时间需要5分钟。

Laravel模型查询去重,distinct方法如何高效使用?

在调用`select()`之后链式使用`distinct()`,但结果仍然是重复的——这大概是因为你没有理解Laravel的`distinct()`实际作用的原理。实际上,`distinct()`实现的不是某个字段的去重,而是整体结果的去重。这意味着它等价于SQL中的`DISTINCT *`,即只要求任意一列的值不重复即可,而不是要求所有列的值都不重复。

简单来说,如果你希望结果不包含重复的行,你需要指定一个或多个字段进行去重。例如,如果你有一个用户表,你想获取不重复的用户ID,可以这样写:

比如查用户邮箱和头像:User::select('email', 'avatar')->distinct()->get(),只要 emailavatar 组合唯一,就保留;但如果两个用户邮箱相同、头像不同,这两条都会出来——这不是 bug,是预期行为。

  • 想按单字段去重?不能只靠 distinct(),得配合 groupBy() 或子查询
  • distinct() 在 MySQL 中对 NULL 值默认视为相同,但 PostgreSQL 可能不一致,跨数据库时要留意
  • 如果用了 with() 预加载关联模型,distinct() 通常失效——因为 JOIN 会放大主表行数,去重逻辑被破坏

Laravel 10+ 中 distinctOn() 的正确姿势

PostgreSQL 支持 DISTINCT ON,Laravel 10 起原生支持 distinctOn() 方法,但仅限 PG。

阅读全文
标签:Laravel

本文共计1055个文字,预计阅读时间需要5分钟。

Laravel模型查询去重,distinct方法如何高效使用?

在调用`select()`之后链式使用`distinct()`,但结果仍然是重复的——这大概是因为你没有理解Laravel的`distinct()`实际作用的原理。实际上,`distinct()`实现的不是某个字段的去重,而是整体结果的去重。这意味着它等价于SQL中的`DISTINCT *`,即只要求任意一列的值不重复即可,而不是要求所有列的值都不重复。

简单来说,如果你希望结果不包含重复的行,你需要指定一个或多个字段进行去重。例如,如果你有一个用户表,你想获取不重复的用户ID,可以这样写:

比如查用户邮箱和头像:User::select('email', 'avatar')->distinct()->get(),只要 emailavatar 组合唯一,就保留;但如果两个用户邮箱相同、头像不同,这两条都会出来——这不是 bug,是预期行为。

  • 想按单字段去重?不能只靠 distinct(),得配合 groupBy() 或子查询
  • distinct() 在 MySQL 中对 NULL 值默认视为相同,但 PostgreSQL 可能不一致,跨数据库时要留意
  • 如果用了 with() 预加载关联模型,distinct() 通常失效——因为 JOIN 会放大主表行数,去重逻辑被破坏

Laravel 10+ 中 distinctOn() 的正确姿势

PostgreSQL 支持 DISTINCT ON,Laravel 10 起原生支持 distinctOn() 方法,但仅限 PG。

阅读全文
标签:Laravel