本文介绍如何利用 laravel 查询构造器的 `when()` 方法,优雅地替代冗长的 if-elseif 条件链,实现动态、可读性强且易于维护的多条件数据库搜索。
在 Laravel 开发中,处理前端传入的多个可选搜索参数(如关键词、日期范围、员工 ID 等)时,若采用传统 if/elseif 嵌套判断,不仅代码臃肿、易出错,还极难扩展与测试。幸运的是,Laravel 提供了强大的 条件式查询构造器方法 when(),它允许你仅在条件为真时才向查询中添加对应子句,从而将原本分散、重复的逻辑收敛为一条链式、声明式的查询语句。
以下是优化后的完整实现:
$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) {
// 注意:此处需用 whereNested 避免 OR 优先级问题(关键!)
$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();✅ 关键优化点说明:
? 额外建议:
通过 when(),你不再需要写“条件排列组合”,而是专注表达“当某条件存在时,就加上这个约束”——这才是现代 Laravel 查询应有的简洁与力量。