You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:36:03