Laravel搜索筛选器查询带空格的完整姓名失败,单独查询名或姓正常
问题原因
你当前的搜索逻辑是将完整搜索词整体和name(名)、surname(姓)两个字段单独做模糊匹配,当输入带空格的完整姓名时,整个搜索词既不会出现在名单独字段,也不会出现在姓单独字段,因此匹配不到结果。
修复方案
调整scopeSearchFilter的查询逻辑,先拆分搜索词的多个片段,同时兼容「单独匹配名/姓」和「拆分后分别匹配名+姓」的场景,修改后的代码如下:
public function scopeSearchFilter($query, array $filters) { $searchTerm = $filters[0]; $category = $filters[1]; $query->when($filters[0] ?? false, function($query, $searchTerm) { // 清理搜索词,拆分空格分隔的多个片段 $searchTerm = trim($searchTerm); $nameParts = preg_split('/\s+/', $searchTerm); $query->whereHas('author', function ($query) use ($searchTerm, $nameParts) { // 原有逻辑:整体匹配名或姓 $query->where('name', 'like', '%' . $searchTerm . '%') ->orWhere('surname', 'like', '%' . $searchTerm . '%'); // 新增逻辑:拆分后分别匹配名和姓 if (count($nameParts) >= 2) { $query->orWhere(function($q) use ($nameParts) { // 第一个片段匹配名,剩余片段匹配姓 $firstPart = array_shift($nameParts); $lastPart = implode(' ', $nameParts); $q->where('name', 'like', '%' . $firstPart . '%') ->where('surname', 'like', '%' . $lastPart . '%'); }); } }); }); }
补充说明
- 上述代码使用
preg_split拆分搜索词,兼容用户输入多个空格分隔姓名的场景 - 如果你的业务中存在姓在前、名在后的搜索习惯,可以再补充一组反过来匹配的条件,把姓匹配第一个片段、名匹配剩余片段即可
- 控制器代码无需做任何修改,调整模型方法后即可生效
内容的提问来源于stack exchange,提问作者BootDev
相关产品推荐
相关产品推荐

