贝利信息

如何使用 Laravel 的 when() 方法简化复杂的条件查询逻辑

日期:2026-01-07 00:00 / 作者:碧海醫心

本文介绍如何利用 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 查询应有的简洁与力量。