You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,模板中直接判断即可:

  1. 控制器层代码:
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'));
}
  1. 模板层代码简化为:
@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-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:15:46