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
相关产品推荐
相关产品推荐

