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

Laravel中如何通过拼接姓名列实现按全名筛选用户?

Laravel中如何通过拼接姓名列实现按全名筛选用户?

嘿,我来帮你搞定这个按全名灵活筛选用户的需求!你现有的思路其实已经很靠谱了,不过咱们可以调整得更完善,让搜索能覆盖输入全名、单独名、单独姓甚至是姓氏在前的组合场景,不管用户怎么输入都能精准命中目标用户。

先给你看优化后的完整实现代码:

$dataQuery = $dataQuery->where(function ($query) use ($fullname) {
    // 先处理输入的首尾空格,避免无效匹配
    $searchTerm = trim($fullname);
    
    // 匹配单独的名或者姓
    $query->where('users.firstname', 'like', "%{$searchTerm}%")
          ->orWhere('users.lastname', 'like', "%{$searchTerm}%")
          // 匹配「名+姓」的拼接组合
          ->orWhereRaw("CONCAT(users.firstname, ' ', users.lastname) LIKE ?", ["%{$searchTerm}%"])
          // 额外支持「姓+名」的拼接,覆盖用户先输姓的习惯
          ->orWhereRaw("CONCAT(users.lastname, ' ', users.firstname) LIKE ?", ["%{$searchTerm}%"]);
});

接下来给你拆解这段代码的逻辑:

  • 首先用trim()处理输入内容,避免首尾空格导致的错误匹配;
  • 保留了基础的单独名/姓匹配,确保用户输入单个名字部分时能找到结果;
  • 新增数据库层面的字符串拼接匹配,直接把名和姓拼起来和搜索词对比,不管用户输入的是带空格的完整全名还是连续的姓名组合,都能匹配到;
  • 额外加了「姓+名」的拼接匹配,毕竟有些用户习惯先输入姓氏再输名字,这样能覆盖更多真实的搜索场景。

如果你还想保留原来那种「输入两个部分时精准匹配名和姓分别对应」的逻辑,也可以把两种方式结合起来,比如:

$dataQuery = $dataQuery->where(function ($query) use ($fullname) {
    $searchTerm = trim($fullname);
    $nameParts = explode(' ', $searchTerm);
    
    // 场景1:输入的是2个及以上部分,尝试精准匹配名和姓的组合
    if (count($nameParts) >= 2) {
        $query->where(function ($q) use ($nameParts) {
            // 第一个部分匹配名,剩余部分拼接成姓
            $q->where('users.firstname', 'like', "%{$nameParts[0]}%")
              ->where('users.lastname', 'like', "%".implode(' ', array_slice($nameParts, 1))."%");
        })->orWhere(function ($q) use ($nameParts) {
            // 反过来,第一个部分匹配姓,剩余部分拼接成名
            $q->where('users.lastname', 'like', "%{$nameParts[0]}%")
              ->where('users.firstname', 'like', "%".implode(' ', array_slice($nameParts, 1))."%");
        });
    }
    
    // 场景2:兜底匹配,覆盖所有其他情况
    $query->orWhere('users.firstname', 'like', "%{$searchTerm}%")
          ->orWhere('users.lastname', 'like', "%{$searchTerm}%")
          ->orWhereRaw("CONCAT(users.firstname, ' ', users.lastname) LIKE ?", ["%{$searchTerm}%"])
          ->orWhereRaw("CONCAT(users.lastname, ' ', users.firstname) LIKE ?", ["%{$searchTerm}%"]);
});

最后提醒几个小细节:

  • 用参数绑定(比如代码里的?和数组参数)代替直接字符串拼接,能有效防止SQL注入,让查询更安全;
  • 如果你的数据库是PostgreSQL,要把CONCAT换成users.firstname || ' ' || users.lastname这种拼接方式,或者用CONCAT_WS(' ', users.firstname, users.lastname);
  • 如果用户输入的空格很多,可以考虑用preg_split('/\s+/', $searchTerm)来分割名字部分,避免多个空格导致的数组元素为空的问题。

备注:内容来源于stack exchange,提问作者Piyumi Gamage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:29:33