Laravel中基于日期范围及关联字段实现销售筛选的方法
解决销售筛选页面的组合筛选逻辑问题
嘿,我看了你的代码,问题出在不管筛选参数有没有值,你都强制加上了所有的WHERE条件——比如当用户只选日期范围时,currency_id和company_id是空的,这时候查询会去匹配currency_id = ''和company_id = ''的记录,自然得不到正确结果。
咱们可以通过动态构建查询语句来实现你要的组合筛选逻辑:只有当某个筛选参数有值时,才把对应的条件加到查询里。下面是修改后的完整代码:
public function filterSale(Request $request) { // 获取客户和货币下拉选项数据 $customers = \DB::table('companies')->where('category', 'customer')->pluck('comp_name', 'id')->all(); $currencies = \DB::table('currencies')->orderBy('default', 'desc')->pluck('acronym', 'id')->all(); // 初始化基础查询:只查询已发布的销售记录 $salesQuery = Sales::where('publish', 1); // 1. 处理日期范围筛选:仅当from_date和to_date都不为空时添加 if ($request->filled('from_date') && $request->filled('to_date')) { $salesQuery->whereBetween('created_at', [$request->from_date, $request->to_date]); } // 2. 处理货币筛选:当currency_id有值时添加 if ($request->filled('currency_id')) { $salesQuery->where('currency_id', $request->currency_id); } // 3. 处理客户筛选:当company_id有值时添加 if ($request->filled('company_id')) { $salesQuery->where('company_id', $request->company_id); } // 执行查询获取结果 $sales = $salesQuery->get(); // 返回视图,优化了数据传递的写法 return view('reports.salesReport', compact('sales', 'customers', 'currencies')) ->with('selectedCurrency', $request->currency_id) ->with('selectedCustomer', $request->company_id); }
关键修改点说明:
- 动态查询构建:用
$salesQuery先初始化基础条件,再根据参数是否存在(用$request->filled()判断,比直接判断!= ''更严谨,能处理参数不存在的情况),逐步添加筛选条件。这样就能支持:- 仅日期范围筛选
- 日期+客户
- 日期+货币
- 日期+货币+客户
这些组合场景。
- 修复视图传递错误:原来的
compact('sales', $sales)是错误用法,compact只需要传变量名的字符串;同时把返回的筛选选项变量名改成更语义化的customers,选中的筛选值重命名为selectedCurrency和selectedCustomer,方便前端回显选中状态。 - 可读性提升:把每个筛选逻辑拆成独立的判断块,后续维护和扩展新筛选条件会更方便。
另外,建议给请求参数加一些验证规则,避免无效参数导致查询出错,比如在方法开头添加:
$request->validate([ 'from_date' => 'nullable|date', 'to_date' => 'nullable|date|after_or_equal:from_date', 'currency_id' => 'nullable|exists:currencies,id', 'company_id' => 'nullable|exists:companies,id', ]);
这样能让你的筛选功能更健壮哦!
内容的提问来源于stack exchange,提问作者SleepWalker
相关产品推荐
相关产品推荐

