ThinkPHP6接口搜索过滤需参数白名单校验、动态条件组装(like/等值/between/in)、分页与索引优化、统一JSON响应。例如白名单过滤字段,时间校验格式,高频字段建索引,空结果返回空数组而非报错。

ThinkPHP6 的接口搜索过滤功能,核心在于对请求参数的解析、条件组装与查询执行。不依赖第三方组件也能高效实现,关键是合理使用 where 条件链、like / between / in 等查询方法,并做好参数合法性校验。
参数接收与字段白名单控制
避免直接用所有 GET 参数拼接查询,防止非法字段注入或意外查询。应预先定义允许参与搜索的字段列表:
- 在控制器中维护一个白名单数组,如
['title', 'status', 'category_id', 'created_at']</li> <li>用 <code>input()
获取全部参数后,用array_intersect_key()过滤出合法字段 - 对时间类字段(如 created_at)额外做格式校验,拒绝非标准日期字符串
动态条件组装策略
不同字段需匹配不同查询逻辑,不能一概用 like:
- 文本字段(title、content)→ 使用
where('title', 'like', "%{$value}%") - 状态字段(status)→ 直接等值匹配:
where('status', $value) - 范围字段(created_at)→ 拆成
start_time和end_time,用whereBetween('created_at', [$start, $end]) - 多选字段(category_id)→ 接收为数组,用
whereIn('category_id', $ids)
分页与性能兼顾处理
搜索接口常面临大数据量场景,需注意:
- 默认启用分页,用
$query->paginate(15)而非select()全查 - 对高频搜索字段(如 title、status)确保数据库已建立索引
- 必要时增加缓存层,例如对固定组合参数的搜索结果缓存 5–10 分钟
- 避免在 where 中使用函数(如
whereRaw("DATE(created_at) = ...")),影响索引使用
统一响应与空结果处理
搜索结果无论有无数据,都应返回结构一致的 JSON:
- 包含
code、msg、data(含list和pagination信息) - 空结果不报错,
data.list返回空数组,msg可写“未找到匹配项” - 错误情况(如时间格式非法)应拦截在条件组装前,返回明确提示而非 500

















