Laravel Query Builder用CONCAT实现姓名模糊查询语法错误如何解决?
错误原因排查
- 多余的
SELECT关键字:select()方法本身会自动拼接SQL的SELECT前缀,你在DB::raw()里又加了一次SELECT,导致最终SQL出现select SELECT ...的语法错误 where()参数结构错误:你把LIKE运算符和搜索值都写到了DB::raw()的入参括号里,参数拆分错误导致查询构造器无法识别条件,所以最终生成的SQL里出现了不符合预期的is null判断- 语法混用:控制器代码里不能用Blade模板的
{{ }}语法输出变量,直接拼接SQL字符串还会带来SQL注入风险 - 拼接规则不符:你原生SQL里是用空格拼接姓和名,但是Laravel代码里写的是用逗号拼接,逻辑和需求不一致
可行实现代码
首先确保你已经在控制器顶部引入了DB门面:
use Illuminate\Support\Facades\DB;
修改后的业务代码:
public function getStudent(Request $request) { // 先校验参数合法性 $validated = $request->validate([ 'terms' => 'required|string' ]); $students = Student::select(DB::raw("CONCAT(FirstName, ' ', LastName) AS FullName")) ->whereRaw( "CONCAT(FirstName, ' ', LastName) LIKE ?", ["%{$validated['terms']}%"] ) ->get(); return response()->json($students); }
优化说明
这里用whereRaw带参数绑定的写法,所有用户输入的参数都会由Laravel自动做转义处理,完全避免SQL注入风险,比直接拼接字符串更安全。
内容的提问来源于stack exchange,提问作者jhenryj09
相关产品推荐
相关产品推荐

