使用Eloquent查询指定日期时段预约总客数返回null如何解决?
问题排查
1. 方法未返回结果
你当前代码在组装完$hours数组后没有写return语句,接口自然返回null,这是最直接的原因。
2. 查询方法使用错误
whereDate()是Laravel提供的日期查询辅助方法,作用是仅匹配日期字段的年月日部分,你传入完整的Y-m-d H:i:s格式时间,它会自动截断为Y-m-d进行匹配,无法精确匹配到对应小时的预约记录。
如果要精确匹配到时分秒的时间点,直接用普通where()条件即可。
3. 可能存在的时区不匹配问题
需要确认你的Laravel配置文件config/app.php中的timezone设置、数据库时区、Carbon创建时间所用的时区三者一致,否则会出现时间偏移导致匹配不到数据。
4. 24小时制时间转换问题
根据你的补充说明,前端时间选择器返回的24小时制12:00会被Eloquent识别为00:00,需要先打印$data['hours']的入参,确认每个小时项的格式是否符合你的预期,避免入参本身就存在转换错误。
修复后的代码
public function getSeats() { $data = request()->validate([ 'date' => 'required', 'hours' => 'required|array', 'place_id' => 'required' ]); $hours = []; foreach($data['hours'] as $h) { // 可临时打印确认时间格式是否正确 // dd($data['date'].' '.$h); $targetTime = Carbon::parse($data['date'].' '.$h); $count = Reservation::where('place_id', $data['place_id']) ->where('date', $targetTime->toDateTimeString()) ->sum('guests'); $hours[] = (object) [ 'hour' => $h, 'guests' => $count ]; } // 必须添加返回语句 return response()->json($hours); }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

