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

