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
相关产品推荐
相关产品推荐

