本文介绍如何利用 laravel 的 `when()` 条件查询方法,替代冗长的 if-elseif 判断链,实现动态、可读性强且安全的数据库搜索逻辑。
在 Laravel 开发中,处理前端传入的多字段组合搜索(如关键词、日期范围、员工 ID 等)时,若采用传统 if/elseif 嵌套判断,不仅代码臃肿、难以维护,还极易因逻辑分支遗漏导致查询异常或 SQL 错误。幸运的是,Laravel 提供了高度语义化的 when() 方法——它允许你按需添加查询约束,仅在条件为真时才执行对应 where 逻辑,从而将复杂的条件拼接转化为链式、声明式的查询构建。
以下是推荐的简化写法(基于你的原始需求重构):
$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->i
nput('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();✅ 关键优化点说明:
⚠️ 注意事项:
通过 when(),你不再需要维护一堆易错的布尔状态组合,而是让查询逻辑随业务自然生长——这才是 Laravel “表达即实现”哲学的真正体现。