Laravel模型软删除后,如何进行基于deleted_at时间查询的筛选操作?
- 内容介绍
- 文章标签
- 相关推荐
本文共计812个文字,预计阅读时间需要4分钟。
由于 Laravel 的软删除模型默认会自动过滤掉已软删除的记录,你无需手动添加 `whereNotNull('deleted_at')`。这样做不仅不会解决问题,反而会被 Eloquent 的全局作用域所覆盖。正确的做法是使用 Eloquent 提供的软删除功能,让 Eloquent 自动处理这些记录。
- 软删除模型(用了
SoftDeletestrait)的所有查询,默认都带whereNull('deleted_at') -
whereNotNull('deleted_at')被追加后,实际执行的是WHERE deleted_at IS NULL AND deleted_at IS NOT NULL——永远为 false - 必须先调用
withTrashed()或onlyTrashed()解除全局作用域,再加条件
withTrashed() 和 onlyTrashed() 的区别与选法
两者都绕过软删除的全局作用域,但行为不同:前者包含未删 + 已删,后者只取已删。别凭名字猜,得看你要什么数据。
本文共计812个文字,预计阅读时间需要4分钟。
由于 Laravel 的软删除模型默认会自动过滤掉已软删除的记录,你无需手动添加 `whereNotNull('deleted_at')`。这样做不仅不会解决问题,反而会被 Eloquent 的全局作用域所覆盖。正确的做法是使用 Eloquent 提供的软删除功能,让 Eloquent 自动处理这些记录。
- 软删除模型(用了
SoftDeletestrait)的所有查询,默认都带whereNull('deleted_at') -
whereNotNull('deleted_at')被追加后,实际执行的是WHERE deleted_at IS NULL AND deleted_at IS NOT NULL——永远为 false - 必须先调用
withTrashed()或onlyTrashed()解除全局作用域,再加条件
withTrashed() 和 onlyTrashed() 的区别与选法
两者都绕过软删除的全局作用域,但行为不同:前者包含未删 + 已删,后者只取已删。别凭名字猜,得看你要什么数据。

