Laravel中当where子句参数为null时如何返回列所有记录?无需if else的实现方式
如何在Laravel中避免使用if-else实现条件查询?
当然有更简洁的实现方式!Laravel的查询构建器提供了非常好用的when()方法,能帮你彻底丢掉冗余的if-else判断,让代码更优雅。
核心思路
when()方法的作用是根据条件动态添加查询子句:当第一个参数为“真”时,才执行第二个闭包里的查询逻辑;如果参数为“假”,就直接跳过这个条件分支。完美匹配你需要的“当$loantype为null时不添加loan_type筛选”的需求。
优化后的代码
// 先处理$loantype(也可以直接用$request->input('regloan_type'),Laravel会自动处理null情况) $loantype = empty($request['regloan_type']) ? null : $request['regloan_type']; $loans = Loan::select('date_release') ->where('invalid', false) ->where('transaction_year', $transyear) // 只有当$loantype不为null时,才添加loan_type的筛选条件 ->when($loantype, function ($query) use ($loantype) { return $query->where('loan_type', $loantype); }) ->get();
更精准的条件控制(可选)
如果你需要严格判断“仅当$loantype不为null时才筛选”(比如允许$loantype为空字符串的场景),可以把when()的第一个参数改成更明确的判断:
->when(!is_null($loantype), function ($query) use ($loantype) { return $query->where('loan_type', $loantype); })
这样写出来的代码不仅去掉了重复的查询构建逻辑,还更符合Laravel的设计哲学,可读性和维护性都更高。
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

