Laravel中SQL拼接first_name和last_name查询fullname报字段不存在错误如何解决
问题排查
- 你贴出的代码存在基础语法错误:
CONCAT('first_name', 'last_name')中给字段名加了单引号,导致SQL将其识别为字符串常量而非表字段,无法正确拼接两个字段的值。同时闭包内使用的参数$firstName没有在use中引入,属于变量未定义问题。 - 报错信息显示存在
full_name字段不存在的错误,说明你实际运行的代码与贴出的代码不一致,你在查询逻辑的其他位置增加了针对full_name字段的过滤条件,但你的users表中没有该字段,因此触发报错。 - 报错中的SQL片段
LIKE sdfdf%说明参数绑定逻辑存在错误,没有给搜索值加引号,也会导致SQL语法报错。
修复方案
基础修复(直接实现全名搜索)
如果是全等匹配全名:
User::where(function($query) use ($fullName) { // 字段不加单引号,中间加空格符合正常全名拼接规则 $query->whereRaw("CONCAT(first_name, ' ', last_name) = ?", [$fullName]); })->get();
如果是模糊匹配全名:
User::where(function($query) use ($fullName) { $query->whereRaw("CONCAT(first_name, ' ', last_name) LIKE ?", ["%{$fullName}%"]); })->get();
优化方案(复用搜索逻辑)
可以在User模型中封装查询作用域,避免每次写重复的拼接逻辑:
// 写入 app/Models/User.php 文件中 public function scopeWhereFullName($query, $fullName, $isFuzzy = false) { $concatField = "CONCAT(first_name, ' ', last_name)"; if ($isFuzzy) { return $query->whereRaw("{$concatField} LIKE ?", ["%{$fullName}%"]); } return $query->whereRaw("{$concatField} = ?", [$fullName]); } // 业务代码中直接调用 // 全等匹配 User::whereFullName('张三')->get(); // 模糊匹配 User::whereFullName('张三', true)->get();
另外需要删除你代码中所有直接使用full_name作为查询字段的逻辑,即可解决字段不存在的报错。
内容的提问来源于stack exchange,提问作者CoderTn
相关产品推荐
相关产品推荐

