Laravel怎么实现模型软删除与全文搜索兼容_LaravelElasticsearch排除已删【说明】

小芳同学_8461

小芳同学_8461

2026-03-21

427人浏览

原创

软删除模型在elasticsearch中默认仍被索引,需在shouldbesearchable()中显式排除软删记录、同步时清空旧索引、路由绑定使用withtrashed()并手动校验、es查询加must_not exists deleted_at条件,确保全链路一致过滤。

laravel怎么实现模型软删除与全文搜索兼容_laravelelasticsearch排除已删【说明】

软删除模型在 Elasticsearch 中默认仍被索引

软删除只是给 deleted_at 字段赋值,并不真正从数据库删掉记录;Elasticsearch 的同步逻辑(比如用 laravel/scout + elastic-client)若没显式过滤,就会把已软删的模型照常推到 ES 里。搜索时自然能查出来,和业务预期冲突。

常见错误现象:Model::withTrashed()->find(1) 能查到,但前端搜关键词却返回已被“删除”的文章——用户点进去发现 404 或权限拒绝,体验断裂。

  • 确保 Scout 监听的是 saved 和 deleted 事件,而不是仅 created/updated
  • 重写模型的 shouldBeSearchable() 方法,显式排除软删状态:
    public function shouldBeSearchable(): bool
    {
        return $this->exists && ! $this->trashed();
    }
  • 如果用了自定义同步命令(如 php artisan scout:import),执行前先清空旧索引,否则残留数据不会自动清理

全文搜索结果里点击跳转 404,因为路由没处理软删除

ES 返回了 ID=123 的文档,但 Laravel 路由里写的是 Model::findOrFail($id) —— 它不认 trashed(),直接抛 ModelNotFoundException,最终 404。这不是搜索的问题,是后续链路断了。

使用场景:后台内容管理页带站内搜索,运营搜“活动预告”,点进结果却发现页面打不开。

  • 控制器中改用 Model::where('id', $id)->withTrashed()->firstOrFail(),再手动检查 if ($model->trashed()) { abort(404); }
  • 或者统一加中间件,在模型绑定阶段就拦截:
    Route::bind('post', function ($value) {
        return Post::withTrashed()->findOrFail($value);
    });
    然后在对应控制器方法里判断 $post->trashed()
  • 别依赖 Route::model() 默认行为,它不处理软删除

Scout + Elasticsearch 同步延迟导致刚软删就搜得到

调用 $model->delete() 后,Scout 默认通过队列异步更新 ES,中间有毫秒到秒级延迟。用户刚点“删除”,立刻搜关键词,旧数据还在 ES 里,结果又出现了。

Laravel Creem Agent
Laravel Creem Agent

Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

下载

性能影响:强行同步(withoutSyncingToSearch 或 searchable() 手动触发)会阻塞请求,尤其批量操作时明显卡顿。

  • 单条操作可接受短暂延迟,不用干预;但管理后台等强一致性场景,建议在软删后立即调用 $model->unsearchable()
  • 避免在事务里调用 unsearchable(),Elasticsearch 客户端可能抛连接异常,导致整个事务回滚失败
  • 检查队列驱动是否正常(如 redis 是否连通、horizon 进程是否存活),延迟不是代码问题而是基础设施问题

用 whereRaw 或布尔查询绕过 Scout 时漏掉软删除过滤

有些搜索逻辑复杂(比如多字段加权、模糊拼写容错),直接写 SearchBuilder 或原生 DSL,这时候很容易只关注匹配逻辑,忘了加 "must_not": {"exists": {"field": "deleted_at"}} 这类条件。

参数差异:Scout 的 query() 方法默认不包含软删除过滤,它只负责把 PHP 查询翻译成 ES DSL,不注入业务规则。

  • 所有手写 raw 查询(包括 DB::table('posts')->whereRaw(...) 回退到 MySQL 全文搜索)都得自行补 WHERE deleted_at IS NULL
  • ES DSL 示例(必须加):
    {
      "query": {
        "bool": {
          "must": [{ "match": { "title": "Laravel" } }],
          "must_not": [{ "exists": { "field": "deleted_at" } }]
        }
      }
    }
  • 别假设 “ES 里没存 deleted_at 就安全”——万一同步逻辑改过,字段存在但值为 null,exists 判断就失效了,稳妥做法是同时检查 "term": {"deleted_at": null} 和 exists 反向

软删除和搜索兼容的关键不在某一行代码,而在于每个数据出口(ES 索引、MySQL 查询、API 响应、路由解析)是否都对 deleted_at 做了同一套解释。漏掉任意一环,就会出现“搜得到但打不开”“删了还显示”这类静默异常。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

837

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

815

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2468

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3661

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

5170

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

3456

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

6549

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1376

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

195

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 197人学习

Composer手册
Composer手册

共0课时 | 0人学习