You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用implode拼接LIKE多值where查询失效如何解决

问题描述

现有存储技能名称的数组如下:

Array
(
    [0] => Python
    [1] => PHP
    [2] => MySQL
)

需要通过LIKE查询关联的技能表,检索匹配任意一项技能的员工记录,原有查询代码如下:

$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 ', 'like', '%' .  implode("' OR primary_skill LIKE '%", $skill_name) .'%')
                    ->distinct()
                    ->get();

直接在where方法内拼接OR条件的写法无法正常运行,需要修正。

错误原因

Laravel查询构造器的where方法会自动对传入的参数做转义、包裹引号处理,手动拼接的OR语句会被当成普通的匹配字符串,最终生成语法错误的SQL语句。另外原代码中primary_skill 字段名末尾多了一个多余空格,也会触发字段不存在的报错。

修正方案

使用闭包包裹多个orWhere条件实现多值LIKE匹配,框架会自动处理参数绑定,既保证SQL语法正确,也能避免SQL注入风险,修正后的完整代码如下:

$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(function ($q) use ($skill_name) {
        foreach ($skill_name as $skill) {
            $q->orWhere('primary_skill', 'like', "%{$skill}%");
        }
    })
    ->distinct()
    ->get();

补充说明:如果业务需求是查询同时掌握所有指定技能的员工,只需要把循环内的orWhere替换为where即可。

内容的提问来源于stack exchange,提问作者Shanu k k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:36:16