ThinkPHP搜索功能开发教程

夏芳姑娘_8934

夏芳姑娘_8934

2026-05-24

1095人浏览

原创

thinkphp搜索功能需用array_filter过滤空值、|实现多字段or模糊查询、搜索器处理复杂条件;空值不清理会导致全表过滤,字段名丢失因未用array_filter_use_both,零值保留须用strlen判断,关键词需addcslashes转义,搜索器必须按searchfieldnameattr命名且withsearch静态调用。

thinkphp搜索功能开发教程

ThinkPHP 的搜索功能不是填个 where 数组就能跑通的,空值、模糊、多字段 OR、时间范围这些常见需求,直接硬写会漏数据或报错。

空值导致全表过滤怎么办

TP6 的 where 数组默认做严格等值匹配,['title' => '', 'status' => null] 会生成 WHERE title = '' AND status = NULL,结果一条不剩。

  • 用 array_filter($data, function($v) { return $v !== '' && $v !== null && $v !== [] && $v !== false; }, ARRAY_FILTER_USE_BOTH) 过滤无效值
  • 别省略 ARRAY_FILTER_USE_BOTH,否则字段名丢了,条件就失效
  • 如果要保留零值(比如 score = 0),改用 strlen((string)$v) === 0 判断空字符串更稳妥
  • 动态构建条件数组比依赖 where 数组更可控,尤其在表单提交场景下

多字段模糊查为什么用 | 不用数组

写成 ['title' => "%{$k}%", 'content' => "%{$k}%"] 是 AND 关系,逻辑不对;而 ['title|content|username' => ['like', "%{$k}%"]] 才是 OR。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • | 表示字段间 OR,& 表示 AND,字段名之间不能有空格
  • 字段类型不一致(如 content 是 TEXT,title 是 VARCHAR)可能导致 MySQL 隐式转码失败,建议模型里加 ->bind(['title' => PDO::PARAM_STR])
  • 关键词含 %、_ 等 SQL 特殊字符,必须先 addcslashes($keyword, '%_\') 转义再拼 "%{$escaped}%"

复杂条件必须用搜索器,但 withSearch 不是万能胶

withSearch 是唯一触发搜索器的方法,但它只在模型类上静态调用才有效,User::withSearch(['createTime'], $params)->select() ✅,User::where()->withSearch() ❌ 直接报错。

  • 搜索器方法名必须是 searchFieldNameAttr 格式,比如字段是 create_time → 方法名是 searchCreateTimeAttr
  • searchCreateTimeAttr 的第一个参数 $query 是闭包,不是 Query 对象,得写成 $query(function ($builder) use ($value) { $builder->whereBetween('create_time', $value); });
  • 外部写的 where('status', 1) 和搜索器里的 where('status', 2) 会同时生效,变成 AND status = 1 AND status = 2 → 结果为空,得在搜索器里手动 unset 外部冲突条件
  • TP6.1+ 支持第三个参数控制开关:withSearch(['createTime'], $params, ['createTime' => false]),TP6.0 不支持

Elasticsearch 集成不是装个包就完事

ThinkPHP 本身不带 ES 支持,Class 'ElasticsearchClientBuilder' not found 是环境问题,不是框架 bug。

  • 运行 composer require elasticsearch/elasticsearch:^8.0(ES 8.x 服务端必须配 8.x 客户端)
  • 确认 ext-curl 已启用:php -m | grep curl,没输出就打开 php.ini 的 extension=curl
  • ES 默认禁用自动建索引,必须显式调 $client->indices()->create(),并在 mappings 中为中文字段指定 'analyzer' => 'ik_smart'
  • 数据同步靠钩子:在模型 afterWrite 里调 bulk 写入(100 条/批),在 afterDelete 里补 delete,否则删了 MySQL 记录,ES 还留着

搜索器命名规则、withSearch 的调用位置、ES 索引创建时机——这三个点最容易被跳过,一漏就卡半天。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

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

下载

相关标签:

thinkphp php php搜索功能

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

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9844

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5881

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2075

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3668

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4354

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3411

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4877

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3802

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11802

4

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程