Laravel 5.6中替代GOTO语句的更优代码实现方案
替代Laravel中GOTO语句的优雅重构方案
看到你在Laravel 5.6里用GOTO来处理查询逻辑,确实GOTO很容易让代码变得混乱难维护。咱们可以利用Laravel查询构造器的链式特性,把逻辑拆解成更清晰的步骤,完全不需要GOTO就能实现相同功能,代码还更易读。
重构后的代码
public function job_finished_search(Request $request) { $rFrom = $request->input('datepicker_from'); $rTo = $request->input('datepicker_to'); $rName = $request->customer_name; // 处理三个参数都为空的边界情况 if (is_null($rFrom) && is_null($rTo) && is_null($rName)) { Flash::error('Search result not found'); return redirect(route('pdf.index')); } // 初始化基础查询(提取所有分支的共同逻辑) $query = Job::onlyTrashed() ->where('is_trash', 0) ->orderBy('created_at', 'desc'); // 根据参数存在情况,链式添加过滤条件 if (!is_null($rName)) { $query->where('customer_name', $rName); } if (!is_null($rTo)) { $query->where('created_at', '<=', Carbon::parse($rTo)->endOfDay()); } if (!is_null($rFrom)) { // 补充原代码未完整展示的起始日期过滤逻辑,可根据实际需求调整 $query->where('created_at', '>=', Carbon::parse($rFrom)->startOfDay()); } // 获取目标ID集合(对应原代码的A点逻辑) $job_ids = $query->pluck('id')->all(); // 后续业务逻辑继续在这里编写... }
重构的核心优势
- 逻辑更清晰:把参数判断和查询构建分离,每个参数的过滤规则独立成块,一眼就能看懂每个参数对应的作用
- 符合Laravel最佳实践:充分利用查询构造器的链式调用特性,这也是Laravel官方推荐的查询构建方式
- 可维护性更高:后续新增过滤参数时,只需添加对应的条件判断和查询语句即可,不用再嵌套复杂的if分支或依赖GOTO跳转
- 可读性更强:线性的执行流程让其他开发者更容易理解和调试代码,避免了GOTO带来的“跳跃式”代码混乱
内容的提问来源于stack exchange,提问作者JsWizard
相关产品推荐
相关产品推荐

