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

Laravel 5 高级搜索:将精确匹配改为LIKE模糊查询的实现

解决Laravel高级搜索的子串匹配需求

嘿,这个需求很常见,咱们只需要调整一下查询条件的构建方式就行——原来的where($simple_filter)是做精确匹配,现在要改成针对每个字段的子串模糊匹配(也就是LIKE %xxx%)。

修改后的代码(Laravel 9+ 推荐写法)

Laravel 9及以上版本提供了whereLike方法,用起来非常简洁:

public function advanced_search(Request $request) { 
    // 获取用户提交的所有数据
    $post = $request->all(); 
    // 定义需要筛选的字段列表
    $simple_filter = array( 
        "first_name" => "", 
        "last_name" => "", 
        "email" => "", 
        "company_name" => "", 
    ); 

    foreach ($simple_filter as $key => $value) { 
        if (isset($post[$key]) && trim($post[$key]) !== '') { 
            // 只保留用户填了有效内容的字段,过滤纯空格的情况
            $simple_filter[$key] = trim($post[$key]); 
        } else { 
            unset($simple_filter[$key]); 
        } 
    } 

    // 初始化查询构造器,先不添加任何条件
    $query = DB::table('contacts');

    // 遍历筛选字段,逐个添加子串匹配条件
    foreach ($simple_filter as $key => $value) {
        $query->whereLike($key, "%{$value}%");
    }

    // 执行查询并返回DataTables格式的JSON
    return DataTables::of($query->get())->toJson(); 
}

兼容Laravel 8及以下版本的写法

如果你的项目用的是Laravel 8或更早的版本,没有whereLike方法,那就手动构建LIKE条件:

public function advanced_search(Request $request) { 
    $post = $request->all(); 
    $simple_filter = array( 
        "first_name" => "", 
        "last_name" => "", 
        "email" => "", 
        "company_name" => "", 
    ); 

    foreach ($simple_filter as $key => $value) { 
        if (isset($post[$key]) && trim($post[$key]) !== '') { 
            $simple_filter[$key] = trim($post[$key]); 
        } else { 
            unset($simple_filter[$key]); 
        } 
    } 

    $query = DB::table('contacts');

    foreach ($simple_filter as $key => $value) {
        // 手动添加LIKE模糊匹配条件
        $query->where($key, 'LIKE', "%{$value}%");
    }

    return DataTables::of($query->get())->toJson(); 
}

关键改动说明

  • 去掉了原来直接用where($simple_filter)的精确匹配写法,改成逐个添加模糊匹配条件,确保每个字段都会用LIKE %值%来匹配子串
  • 把原来的空值判断逻辑优化成trim($post[$key]) !== '',可以过滤掉用户只输入空格的无效内容
  • 拆分了查询初始化和条件添加的步骤,让逻辑更清晰,也方便后续扩展其他筛选规则

额外小提示

如果担心用户输入的内容里包含%或_这类LIKE的通配符(会干扰匹配逻辑),可以用DB::raw来转义:

$query->where($key, 'LIKE', DB::raw('?'), ["%{$value}%"]);

不过大部分业务场景下,直接用上面的基础写法就足够啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:18