使用whereBetween查询同日数据无结果的技术求助
问题解决:单日数据查询失败的修复
问题出在**whereBetween的日期范围匹配逻辑**上:如果你的pengeluaran.tanggal字段是datetime/timestamp类型(包含时分秒),当你传入相同的日期字符串(比如07-12-2022),Laravel会默认把它解析为当天的00:00:00,此时whereBetween的范围是07-12-2022 00:00:00到07-12-2022 00:00:00,自然查不到当天带时分秒的数据。
下面是两种可行的修复方案:
方案1:扩展结束日期到当天23:59:59
利用Carbon处理日期,把结束日期设置为当天的最后一秒,确保覆盖全天的时间范围:
$request->validate( [ 'tanggal_awal' => 'required|date', 'tanggal_akhir' => 'required|date' ], [ 'tanggal_awal.required' => 'Tanggal awal tidak boleh kosong!', 'tanggal_akhir.required' => 'Tanggal akhir tidak boleh kosong!', 'tanggal_awal.date' => 'Tanggal awal harus berformat tanggal yang valid!', 'tanggal_akhir.date' => 'Tanggal akhir harus berformat tanggal yang valid!', ] ); // 用Carbon解析日期,确保格式正确 $tanggal_awal = \Carbon\Carbon::createFromFormat('d-m-Y', $request->tanggal_awal)->startOfDay(); $tanggal_akhir = \Carbon\Carbon::createFromFormat('d-m-Y', $request->tanggal_akhir)->endOfDay(); if ($tanggal_awal && $tanggal_akhir) { $pengeluaran = Pengeluaran::whereBetween('tanggal', [$tanggal_awal, $tanggal_akhir])->get(); $totalpengeluaran = Pengeluaran::whereBetween('tanggal', [$tanggal_awal, $tanggal_akhir])->sum('jumlah'); } else { $pengeluaran = Pengeluaran::latest()->get(); $totalpengeluaran = Pengeluaran::sum('jumlah'); // 补充默认情况的总金额 } return view('pengeluaran.cetak_pengeluaran', compact('pengeluaran', 'totalpengeluaran', 'tanggal_awal', 'tanggal_akhir'));
说明:
- 给验证规则加上
date,确保传入的是合法日期 - 用
createFromFormat指定日期格式(你的参数是d-m-Y格式:日-月-年) startOfDay()把开始日期设为当天00:00:00,endOfDay()把结束日期设为当天23:59:59,覆盖全天数据
方案2:直接匹配日期部分(忽略时分秒)
如果只需要匹配日期,不管具体时间,可以用whereDate方法,直接对比日期部分:
$request->validate( [ 'tanggal_awal' => 'required|date', 'tanggal_akhir' => 'required|date' ], [ 'tanggal_awal.required' => 'Tanggal awal tidak boleh kosong!', 'tanggal_akhir.required' => 'Tanggal akhir tidak boleh kosong!', 'tanggal_awal.date' => 'Tanggal awal harus berformat tanggal yang valid!', 'tanggal_akhir.date' => 'Tanggal akhir harus berformat tanggal yang valid!', ] ); $tanggal_awal = \Carbon\Carbon::createFromFormat('d-m-Y', $request->tanggal_awal)->toDateString(); $tanggal_akhir = \Carbon\Carbon::createFromFormat('d-m-Y', $request->tanggal_akhir)->toDateString(); if ($tanggal_awal && $tanggal_akhir) { // 当开始和结束日期相同时,直接用whereDate if ($tanggal_awal === $tanggal_akhir) { $pengeluaran = Pengeluaran::whereDate('tanggal', $tanggal_awal)->get(); $totalpengeluaran = Pengeluaran::whereDate('tanggal', $tanggal_awal)->sum('jumlah'); } else { // 日期范围不同时,继续用whereBetween $pengeluaran = Pengeluaran::whereBetween('tanggal', [$tanggal_awal, $tanggal_akhir])->get(); $totalpengeluaran = Pengeluaran::whereBetween('tanggal', [$tanggal_awal, $tanggal_akhir])->sum('jumlah'); } } else { $pengeluaran = Pengeluaran::latest()->get(); $totalpengeluaran = Pengeluaran::sum('jumlah'); } return view('pengeluaran.cetak_pengeluaran', compact('pengeluaran', 'totalpengeluaran', 'tanggal_awal', 'tanggal_akhir'));
说明:
whereDate会自动忽略tanggal字段的时分秒部分,只对比日期,适合单日查询场景- 增加了日期相同的判断,优化查询逻辑
内容的提问来源于stack exchange,提问作者Arya Rizky Sandi
相关产品推荐
相关产品推荐

