Laravel中按全名搜索用户CONCAT拼接字段报SQL语法错误如何解决
问题解决方法
报错原因
你当前的SQL语法错误源于LIKE匹配的通配符%位置错误:生成的SQL语句中%放在了字符串单引号的外侧,不符合MariaDB/MySQL的语法规范,所以触发1064语法错误。
修复方案
方案1:快速修复(不推荐,存在SQL注入风险)
仅调整通配符的位置,将%放到单引号内部即可:
->whereRaw('CONCAT(first_name," ",last_name) LIKE \''.$fullName.'%\'');
如果需要前后模糊匹配,调整为:
->whereRaw('CONCAT(first_name," ",last_name) LIKE \'%'.$fullName.'%\'');
方案2:参数绑定写法(推荐,安全无SQL注入风险)
使用Laravel查询构造器自带的参数绑定能力,避免手动拼接字符串带来的安全问题:
// 前缀匹配:仅匹配全名以搜索内容开头的用户 ->whereRaw('CONCAT(first_name, " ", last_name) LIKE ?', ["{$fullName}%"]); // 全模糊匹配:匹配全名任意位置包含搜索内容的用户 ->whereRaw('CONCAT(first_name, " ", last_name) LIKE ?', ["%{$fullName}%"]);
完整的修改后代码示例:
$users = User::where(function($usersSearchQuery) use ($user,$fullName){ $usersSearchQuery ->whereNotIn('id', $user->blockerUsers->pluck('blocked_id')) ->whereNotIn('id', $user->blockedUsers->pluck('blocker_id')) ->whereRaw('CONCAT(first_name, " ", last_name) LIKE ?', ["%{$fullName}%"]); })->get();
内容的提问来源于stack exchange,提问作者CoderTn
相关产品推荐
相关产品推荐

