Laravel 中应优先用数据库查询而非 PHP 字符串函数过滤集合;str_contains() 用于参数校验,str_replace() 配合 LIKE 实现模糊匹配,explode() + whereNested 支持多词 OR 搜索。

在 Laravel 框架中使用 PHP 8.1 的字符串搜索能力,关键不是“直接调用 PHP 函数做搜索”,而是把 PHP 8.1 的字符串函数作为辅助工具,配合 Laravel 的 Eloquent 或 Query Builder 做服务端高效查询。盲目用 str_contains()、stripos() 等在 PHP 层遍历集合(如 collect()->filter()),会把全表数据拉到内存再过滤——性能差、易超内存、不支持分页。
下面说清楚怎么用得对、用得稳:
用 str_contains() 快速判断请求参数有效性
PHP 8.1 的 `str_contains()` 语义清晰、无类型陷阱,适合做前置校验或简单逻辑分支:
比如用户搜的是空格、连字符或纯空白,提前拦截:
if (str_contains($request->s, [' ', '-']) && strlen(trim($request->s)) > 0) { /* 启用通配符替换逻辑 */ }- 避免对空字符串执行 LIKE 查询(否则
WHERE name LIKE '%%'可能扫全表)
用 str_replace() + _ 通配符实现连字符/空格模糊匹配
MySQL 的 _ 匹配单个字符,正好让 product-example 和 product example 统一命中:
做法是:把用户输入里的空格和连字符替换成 _,再拼进 LIKE 查询:
$pattern = str_replace([' ', '-'], '_', $request->s);Product::where('name', 'like', "%{$pattern}%")->get();- 注意:不用
UPPER()或REPLACE(name, '-', ' ')—— 默认排序规则(如utf8mb4_unicode_ci)已大小写不敏感,且函数操作字段会失效索引
多词搜索时用 explode() + whereNested 实现 OR 组合
用户输“John Doe”,想同时匹配 name=John 或 surname=Doe,不能只查 LIKE '%John Doe%':
拆开关键词,每个词在多个字段上做 OR 匹配:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
$keywords = array_filter(array_map('trim', explode(' ', $request->s)));- 然后循环构建嵌套查询:
->whereNested(fn ($q) => $q->where('first_name', 'like', "%{$kw}%")->orWhere('last_name', 'like', "%{$kw}%")) - 这样每个词都能独立触发匹配,比单次模糊更准
别在 PHP 层用 strpos()/str_contains() 过滤 Eloquent 集合
这是新手高频错误:
❌ 错误写法(先取全部再过滤):
$posts = Post::all(); $posts->filter(fn($p) => str_contains(strtolower($p->title), strtolower($q))); // 全量加载!不可分页!
✅ 正确做法(让数据库干活):
Post::where('title', 'like', "%{$q}%")->paginate(15);- 或结合全文索引(Scout)、或用 MySQL 的
MATCH ... AGAINST(需配置 FULLTEXT)
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










