本文介绍如何利用 laravel 的 `when()` 条件查询方法,替代冗长的 if-elseif 链式判断,实现动态、可读性强且健壮的数据库搜索逻辑。
在 Laravel 开发中,处理前端传来的多字段组合搜索(如关键词、日期范围、员工 ID 等)时,若采用传统 if/elseif 嵌套方式构建查询,不仅代码臃肿、难以维护,还极易因逻辑分支遗漏导致 SQL 错误或数据漏查。Laravel 提供的 when() 方法正是为此类场景量身打造的优雅解决方案——它允许你按需添加查询子句,仅当指定条件为真时才执行对应闭包,从而让构建动态查询变得声明式、链式且高度可读。
以下是一个优化后的完整示例,适用于 Country 模型的复合搜索:
$countries = Country::when($request->filled('status'), function ($query) use ($request) {
$query->where('sr_status', 'LIKE', "%{$request->input('status')}%");
})
->when($request->filled('datefrom'), function ($query) use ($request) {
$query->whereDate('created_at', '>=', $request->input('datefrom'));
})
->when($request->filled('dateto'), function ($query) use ($request) {
$query->whereDate('created_at', '<=', $request->input('dateto'));
})
->when($request->filled('keyvalue'), function ($query) use ($request) {
$query->where(function ($q) use ($request) {
$q->where('sr_name', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('tel_code', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('country_code', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('currency_name', 'LIKE', "%{$request->input('keyvalue')}%");
});
})
->when($request->filled('prepid'), function ($query) use ($request) {
$query->where('prep_emp', 'LIKE', "%{$request->input('prepid')}%");
})
->orderBy('sr_id')
->get();✅ 关键优化点说明:
⚠️ 注意事项:
()->escapeLike() 或参数化处理增强安全性)。通过 when() 方法重构后,原本超过 50 行的嵌套判断被压缩为不到 20 行清晰链式代码,既提升了可维护性,也显著降低了逻辑出错概率——这是 Laravel “约定优于配置”理念在实际开发中的典型实践。