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

Laravel查询构建器:如何在拆分存储的姓名列中匹配完整字符串

解决Laravel查询构建器匹配合并姓名的问题

嘿,我完全懂你的需求!你现在的查询只能单独匹配名或姓里的搜索词,但想要实现输入类似"Peter Smith"这样的完整姓名时,能精准匹配到first_name为Peter、last_name为Smith的记录,同时还能保留原来的单个列模糊匹配功能对吧?

下面给你几种可行的方案:

方案1:同时支持单个列模糊匹配 + 完整姓名匹配

用whereRaw拼接first_name和last_name字段,结合原来的查询逻辑,这样既可以匹配单个列包含搜索词的情况,也能匹配完整姓名的情况:

$query->where(function($subquery) use ($search) {
    // 原来的单个列模糊匹配逻辑
    $subquery->where('partners.first_name', 'like', '%' . $search . '%')
             ->orWhere('partners.last_name', 'like', '%' . $search . '%')
             // 新增:匹配完整的姓名(名+空格+姓),这里用精准匹配
             ->orWhereRaw("CONCAT(first_name, ' ', last_name) = ?", [$search]);
});

如果想要支持模糊匹配完整姓名(比如输入"Pet Smi"也能找到Peter Smith),只需要把=改成LIKE,并给搜索词加上通配符:

$query->where(function($subquery) use ($search) {
    $subquery->where('partners.first_name', 'like', '%' . $search . '%')
             ->orWhere('partners.last_name', 'like', '%' . $search . '%')
             ->orWhereRaw("CONCAT(first_name, ' ', last_name) LIKE ?", ['%' . $search . '%']);
});

方案2:仅匹配完整姓名

如果你不需要单个列的模糊匹配,只需要针对完整姓名进行查询,可以简化成这样:

精准匹配

$query->whereRaw("CONCAT(first_name, ' ', last_name) = ?", [$search]);

模糊匹配

$query->whereRaw("CONCAT(first_name, ' ', last_name) LIKE ?", ['%' . $search . '%']);

重要提醒

  • 一定要用参数绑定(示例中的?和对应的数组参数),不要直接把$search拼进SQL字符串里,这样能有效避免SQL注入风险。
  • CONCAT函数在MySQL、PostgreSQL等主流数据库中都能正常使用,兼容性很好;如果是SQL Server,也可以用这个函数或者+运算符拼接字段。

内容的提问来源于stack exchange,提问作者Yunarito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:52:57