
本文介绍如何在 Laravel 查询构建器中正确实现对数组内多个关键词的模糊匹配,避免错误拼接 WHERE 条件,并推荐使用 MySQL REGEXP 进行高效、安全的多值 LIKE 查询。
本文介绍如何在 laravel 查询构建器中正确实现对数组内多个关键词的模糊匹配,避免错误拼接 where 条件,并推荐使用 mysql `regexp` 进行高效、安全的多值 like 查询。
在 Laravel 中,当需要根据一个技能名称数组(如 ['Python', 'PHP', 'MySQL'])对数据库字段(例如 primary_skill)进行“任一关键词包含”的模糊搜索时,不能通过字符串拼接 OR 逻辑到单个 where() 方法中——因为 where() 接收的是字段、操作符和单一值,传入 'primary_skill LIKE '%Python' OR primary_skill LIKE '%PHP'...' 会被当作完整字符串字面量参与比较,而非 SQL 逻辑表达式,导致查询失效或 SQL 错误。
✅ 正确做法:利用 MySQL 原生 REGEXP(或 RLIKE)操作符,配合 Laravel 的 where() 方法传入正则模式:
$skillNames = ['Python', 'PHP', 'MySQL'];
$employees = DB::table('audit_employee_basics')
->select(
'audit_employee_basics.id as empid',
'emp_name', 'emp_code', 'designation_name',
'emp_company_email_id', 'emp_contact_number',
'emp_gender', 'emp_location', 'department_name',
'emp_joining_date', 'fk_emp_previous_exp', 'image'
)
->join('audit_department', 'audit_employee_basics.emp_fk_dep', '=', 'audit_department.id')
->join('audit_employee_skillset', 'audit_employee_skillset.fk_emp_id', '=', 'audit_employee_basics.id')
->join('audit_designation', 'audit_designation.id', '=', 'audit_employee_basics.emp_fk_des_id')
->where('primary_skill', 'regexp', '(' . implode('|', array_map(fn($s) => preg_quote($s, '/'), $skillNames)) . ')')
->distinct()
->get();
? 关键说明:
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- implode('|', $skillNames) 生成正则分支模式:(Python|PHP|MySQL);
- 强烈建议对 $skillNames 中每个元素执行 preg_quote()(如上例所示),防止特殊正则字符(如 ., *, +, ?, ( 等)引发语法错误或意外匹配;
- REGEXP 默认不区分大小写(取决于字段 collation),若需严格区分,可改用 REGEXP BINARY(MySQL 8.0+)或添加 BINARY 修饰;
- 该方案依赖 MySQL,如使用 PostgreSQL,应改用 ~ 操作符或 ILIKE + ANY(ARRAY[...]);SQLite 则需借助 LIKE 配合 orWhere 动态构建。
⚠️ 注意事项:
- 避免直接 implode('|', $skillNames) 而不转义,存在注入与匹配失控风险;
- REGEXP 在大数据量下可能影响性能,必要时为 primary_skill 字段添加全文索引或考虑 FULLTEXT 搜索替代;
- 若要求「完全匹配任意一项」(而非子串包含),应改用 whereIn('primary_skill', $skillNames)。
综上,用 where(..., 'regexp', ...) 替代错误的字符串拼接 OR,既简洁又安全,是 Laravel 中处理动态多关键词模糊搜索的推荐实践。










