Laravel模型软删除后,如何进行基于deleted_at时间查询的筛选操作?

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

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

Laravel模型软删除后,如何进行基于deleted_at时间查询的筛选操作?

由于 Laravel 的软删除模型默认会自动过滤掉已软删除的记录,你无需手动添加 `whereNotNull('deleted_at')`。这样做不仅不会解决问题,反而会被 Eloquent 的全局作用域所覆盖。正确的做法是使用 Eloquent 提供的软删除功能,让 Eloquent 自动处理这些记录。

  • 软删除模型(用了 SoftDeletes trait)的所有查询,默认都带 whereNull('deleted_at')
  • whereNotNull('deleted_at') 被追加后,实际执行的是 WHERE deleted_at IS NULL AND deleted_at IS NOT NULL——永远为 false
  • 必须先调用 withTrashed()onlyTrashed() 解除全局作用域,再加条件

withTrashed()onlyTrashed() 的区别与选法

两者都绕过软删除的全局作用域,但行为不同:前者包含未删 + 已删,后者只取已删。别凭名字猜,得看你要什么数据。

阅读全文
标签:Laravel

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

Laravel模型软删除后,如何进行基于deleted_at时间查询的筛选操作?

由于 Laravel 的软删除模型默认会自动过滤掉已软删除的记录,你无需手动添加 `whereNotNull('deleted_at')`。这样做不仅不会解决问题,反而会被 Eloquent 的全局作用域所覆盖。正确的做法是使用 Eloquent 提供的软删除功能,让 Eloquent 自动处理这些记录。

  • 软删除模型(用了 SoftDeletes trait)的所有查询,默认都带 whereNull('deleted_at')
  • whereNotNull('deleted_at') 被追加后,实际执行的是 WHERE deleted_at IS NULL AND deleted_at IS NOT NULL——永远为 false
  • 必须先调用 withTrashed()onlyTrashed() 解除全局作用域,再加条件

withTrashed()onlyTrashed() 的区别与选法

两者都绕过软删除的全局作用域,但行为不同:前者包含未删 + 已删,后者只取已删。别凭名字猜,得看你要什么数据。

阅读全文
标签:Laravel