Laravel7 匹配日期字段与当前日期 按条件显示用户请假状态
正确实现代码
可直接替换现有模板的写法
你原先的whereBetween用法不符合当前场景逻辑:whereBetween是用于判断表字段值落在给定的两个参数区间内,而当前需求是判断「今日日期」落在表中start_date和end_date两个字段构成的区间内,因此需要写两个日期匹配条件,修正后的完整模板代码如下:
@foreach ($users as $row ) <tr> <td>{{ $loop->iteration }}</td> <td>{{ $row->id }}</td> <td>{{ $row->name }}</td> <td>{{ $row->dpt->department }}</td> @php $today = Carbon\Carbon::now()->toDateString(); // 格式化到年月日,避免时分秒导致匹配偏差 // 查询当前用户是否存在今日处于有效期内的请假记录 $isOnLeave = App\Leave::where('user_id', $row->id) ->where('start_date', '<=', $today) ->where('end_date', '>=', $today) ->exists(); @endphp <td>{{ $isOnLeave ? 'On Leave' : 'Present' }}</td> </tr> @endforeach
如果你希望用
whereBetween风格实现,也可以把查询条件替换为->whereRaw('? BETWEEN start_date AND end_date', [$today]),执行效果完全一致。
性能优化写法(推荐)
上面的写法会在循环中对每个用户单独执行一次SQL查询,产生N+1性能问题,更合理的实现是在控制器层提前批量查询出当日所有请假用户的ID,模板中直接判断即可:
- 控制器层代码:
public function userList() { $today = now()->toDateString(); // 一次性查出当天所有请假的用户ID $onLeaveUserIds = App\Leave::where('start_date', '<=', $today) ->where('end_date', '>=', $today) ->pluck('user_id') ->toArray(); // 查询用户列表,预加载部门关联避免另一个N+1问题 $users = App\User::with('dpt')->get(); return view('user_list', compact('users', 'onLeaveUserIds')); }
- 模板层代码简化为:
@foreach ($users as $row ) <tr> <td>{{ $loop->iteration }}</td> <td>{{ $row->id }}</td> <td>{{ $row->name }}</td> <td>{{ $row->dpt->department }}</td> <td>{{ in_array($row->id, $onLeaveUserIds) ? 'On Leave' : 'Present' }}</td> </tr> @endforeach
这种写法全程只执行2次SQL,无论用户量多大都不会产生额外查询开销。
内容的提问来源于stack exchange,提问作者Shan Md Shazarul Haque 171-15-
相关产品推荐
相关产品推荐

