如何使用Laravel查询构造器的whereBetween方法筛选起始日期与结束日期之间的数据
使用Laravel查询构造器的whereBetween实现日期范围筛选
看起来你已经搭建好了日期筛选的基础框架,接下来我帮你梳理下这段代码的关键要点,以及一些需要注意的细节,确保日期范围查询能正常工作:
1. Blade视图与日期选择器配置
你的Blade表单已经正确设置了提交路由、CSRF令牌,并且用jQuery UI的日期选择器来规范日期输入格式,这一步做得很到位。需要注意的是日期选择器指定了dateFormat: 'dd-mm-yy',所以用户提交的日期格式是日-月-年,和数据库常用的年-月-日格式不同,后续需要做格式转换。
Blade视图代码
<form action="{{ route('search.between.dates',[$expense_category_data[0]->id]) }}" method="POST"> @csrf <h3 style="color:Blue; text-align: center;text-decoration:underline"><b>Filter Date </b></h3> <input class="form-control" type="text" id="datepicker1" name="start_date" placeholder="Start Date" style="width: 20%; display: inline-block; margin-left:20%; margin-bottom: 2% "> <input class="form-control" type="text" id="datepicker2" name="end_date" placeholder="End Date" style="width: 20%; display: inline-block; margin-left:20%; margin-bottom: 2%"> <br> <button type="submit" class="btn btn-success" style="position: absolute; left: 45%;">Find Expenses</button> </form>
日期选择器脚本
$( function() { $( "#datepicker1" ).datepicker({ dateFormat: 'dd-mm-yy' }); } ); $( function() { $( "#datepicker2" ).datepicker({ dateFormat: 'dd-mm-yy' }); } );
2. 控制器中的日期转换与查询逻辑
控制器里你已经意识到需要把提交的日期格式转换成数据库兼容的格式,这里的dmyToYmd函数是关键。另外,whereBetween子句的使用也正确,它会匹配exp_date在起始日期和结束日期之间的所有记录(包含边界值)。
控制器代码
public function search_between_dates(Request $request,$exp_category_id){ $start_date = dmyToYmd($request->start_date); $end_date = dmyToYmd($request->end_date); $expense_category_data = DB::table('expense_category') ->leftjoin('expense_table','expense_category.id','=','expense_table.exp_category') ->select('expense_category.id as category_id','expense_category.exp_category AS category_name','expense_category.exp_category_details','expense_category.exp_category_image','expense_table.*') ->where('expense_category.id',$exp_category_id) ->whereBetween('expense_table.exp_date',[date($start_date),date($end_date)]) ->get(); return view('admin.Expense_sheet.view_expense_category_details',compact('expense_category_data')); }
重要优化与注意事项
为了让你的代码更健壮,这里有几个关键点需要补充:
- 确保
dmyToYmd函数正确实现:如果这个函数是你自定义的,要保证它能正确转换日期格式,比如:
function dmyToYmd($date) { $dateParts = explode('-', $date); // 验证日期格式是否正确 if(count($dateParts) !== 3) { return now()->format('Y-m-d'); // 或者返回默认值/抛出错误 } return "{$dateParts[2]}-{$dateParts[1]}-{$dateParts[0]}"; }
- 添加表单验证:在控制器开头加上验证逻辑,防止无效日期提交:
$request->validate([ 'start_date' => 'required|date_format:d-m-Y', 'end_date' => 'required|date_format:d-m-Y|after_or_equal:start_date', ]);
数据库字段类型检查:要确保
expense_table表中的exp_date字段是date或datetime类型,否则whereBetween无法正确匹配日期范围。路由确认:确保你的路由已经正确定义在
routes/web.php中,比如:
Route::post('/expense-category/{id}/search-between-dates', [YourExpenseController::class, 'search_between_dates'])->name('search.between.dates');
内容的提问来源于stack exchange,提问作者Masudalimran
相关产品推荐
相关产品推荐

