Laravel多条件组合搜索数据:替代if-else的简洁实现问询
多字段组合搜索的简洁实现方案
我有一个用于数据库数据搜索的模态框(界面包含公司名称、CIN、所在州、地区、城市、公司状态等多个可选搜索字段),希望支持用户选择任意字段组合(如公司名称+CIN、仅公司名称、所在州+地区等)进行数据筛选,仅根据选中的字段返回结果。目前通过编写大量if-else语句实现该功能,想知道有没有更简洁的实现方式,以下是部分现有代码:
else if ($req->state && $req->district) { $data = tbl_company::query() ->where( "state", "LIKE", "%{$req->state}%" )->where( "district", "LIKE", "%{$req->district}%" ) ->paginate(100); } // Filter using only state and city else if ($req->city && $req->district && $req->state == null) { $data = tbl_company::query() ->where( "city", "LIKE", "%{$req->city}%" )->where( "district", "LIKE", "%{$req->district}%" ) ->paginate(100); } // company status only else if ($req->company_status && $req->city == null && $req->district == null && $req->state == null) { $data = tbl_company::query() ->where( "company_status", $req->company_status ) ->paginate(100); }
优化方案:动态构建查询逻辑
你当前的实现需要枚举所有字段组合,不仅代码冗余,后续扩展成本高。可以利用Laravel查询构建器的链式调用特性,动态追加筛选条件,彻底消除冗余的if-else分支。
优化后的代码
// 初始化基础查询实例 $query = tbl_company::query(); // 处理需要模糊匹配的字段(可根据实际需求添加更多字段) $searchableLikeFields = ['state', 'district', 'city', 'company_name', 'cin']; foreach ($searchableLikeFields as $field) { // 检查请求中是否存在该字段且不为空 if (!empty($req->$field)) { $query->where($field, 'LIKE', "%{$req->$field}%"); } } // 处理需要精确匹配的字段 if (!empty($req->company_status)) { $query->where('company_status', $req->company_status); } // 执行分页查询 $data = $query->paginate(100);
核心思路
- 基础查询初始化:先创建一个未添加任何条件的查询构建器实例,作为后续条件的载体。
- 批量处理模糊匹配字段:将所有需要
LIKE模糊匹配的字段放入数组,遍历数组判断请求参数是否存在,存在则追加对应的where条件。 - 单独处理精确匹配字段:对于像
company_status这类需要精确匹配的字段,单独判断并添加条件。 - 统一执行查询:所有条件追加完成后,统一执行分页查询。
这种实现方式的优势:
- 代码简洁,避免大量重复的查询构建代码。
- 扩展性强:新增搜索字段时,只需在对应字段数组中添加字段名即可,无需新增
if-else分支。 - 自动支持所有字段组合的筛选,无需手动枚举每种可能的组合。
内容的提问来源于stack exchange,提问作者swapnil mane
相关产品推荐
相关产品推荐

