thinkphp模型中like查询需用['field' => ['like', '%val%']]语法,tp6支持wherelike快捷方法但仅限前后模糊;搜索含%或_时须手动转义并指定escape符,避免误匹配;whereraw更灵活但需用参数绑定防注入。

ThinkPHP 模型里怎么写 LIKE 查询
ThinkPHP 的模型不直接支持通配符字段模糊匹配语法(比如 name LIKE '%关键词%' 这种写法得自己拼),它把 where 条件封装成数组或闭包,LIKE 得靠 like、not like 等查询表达式来触发。
常见错误是直接写 ['name' => '%关键词%'],结果查不到数据——因为 ThinkPHP 默认做的是全等匹配,不是 SQL 的 LIKE。
- 用
like表达式:写成['name' => ['like', '%关键词%']] - 想前后都模糊?手动加百分号:
['name' => ['like', '%' . $keyword . '%']] - 只匹配开头?用
['name' => ['like', $keyword . '%']] - 注意:
$keyword要自己过滤或转义,ThinkPHP 不会自动对通配符(%、_)做转义
ThinkPHP 6 的 whereLike 方法怎么用
whereLike 是 TP6 新增的快捷方法,比写完整表达式更直观,但默认只做前后模糊(即 LIKE '%xxx%'),不支持自定义位置。
它本质是语法糖,底层还是转成 ['field' => ['like', "%{$value}%"]],所以不能替代手动控制通配符位置的场景。
- 基本用法:
$model->whereLike('name', $keyword)->select() - 想只匹配结尾?它不支持,得退回去用原生表达式:
where(['name' => ['like', '%' . $keyword]]) - 多个字段都要模糊?得链式调用:
->whereLike('name', $k)->whereLike('desc', $k) - 性能注意:
LIKE '%xxx%'无法走索引,大数据量时响应明显变慢
搜索含下划线 _ 或百分号 % 的内容怎么防误匹配
SQL 的 LIKE 把 _ 当作单字符通配符、% 当作多字符通配符。如果用户搜 “a_b”,你没处理,就会匹配到 “aab”、“axb” 等所有中间是任意单字符的值。
ThinkPHP 不提供内置转义机制,得自己加 ESCAPE 并指定转义符,再在 PHP 里统一替换。
- 先选一个转义符,比如
!,然后把用户输入里的!、%、_全部转义:str_replace(['!', '%', '_'], ['!!', '!%', '!_'], $keyword) - 再拼进查询:
['name' => ['like', "%{$escaped}%", '!', 'escape' => '!']] - 注意:TP6.0+ 才支持
escape参数;老版本只能手写原生 SQL 或改用whereRaw - 别漏掉对转义符自身的转义,否则用户搜 “a!b”,会被当成转义指令解析
为什么用 whereRaw 写 LIKE 更灵活但更危险
whereRaw 允许你写原生 SQL 片段,比如 whereRaw("name LIKE ? ESCAPE '!' ", [$escaped]),能完全控制语法和转义逻辑,适合复杂模糊规则(如正则、多字段组合模糊)。
但它绕过了 ThinkPHP 的参数绑定防护,稍不注意就引入 SQL 注入漏洞。
- 必须用参数占位符(
?)+ 第二个参数传值,禁止字符串拼接变量 - 错误示范:
whereRaw("name LIKE '%" . $keyword . "%'")—— 直接挂掉 - 正确写法:
whereRaw("name LIKE CONCAT('%', ?, '%')", [$keyword]) - 如果要用
ESCAPE,记得第二个参数只传值,不要把ESCAPE 'x'写进 SQL 字符串里(那是语法的一部分,不是参数)
通配符模糊看着简单,实际要同时兼顾语义准确、安全、性能,最容易被忽略的是转义逻辑和索引失效问题——尤其当搜索词来自前端未校验输入时,_ 和 % 会悄悄让结果错乱。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











