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

Laravel按日期范围统计指定员工ID总工时并在视图展示的实现方法

问题描述

我有employes和attendances两张数据表,需求是按指定日期范围统计特定员工ID的work_time字段总和,并在视图中展示该结果。我是Laravel新手,希望通过Laravel Eloquent实现此功能,现有模型、控制器及视图代码如下:


现有代码

Employe.php

class Employe extends Model
{
    use HasFactory;

    protected $fillable=['id','employe_code','employe_name','workplace'];

    
    public function attendances(){ 
        return $this->hasMany('App\Models\Attendance');
    }
}

Attendance.php

class Attendance extends Model
{
    use HasFactory;
    protected $fillable=['id','employe_id','attendence_date','clock_in','clock_out','work_time','attendence_status'];


    public function employe()
    {
        return $this->belongsTo('App\Models\employe', 'employe_id');
    }
}

AttendanceController.php

public function attendanceReport(){
   $empname = Employe::get();
    return view('pages.Attendance.attendance_report', compact('empname'));
}

public function attendanceSearch(Request $request){
    $empname = Employe::get();
    if($request->employe_id == 0){
        $emp = Attendance::whereBetween('attendence_date', [$request->from, $request->to])->get();       
        return view('pages.Attendance.attendance_report',compact('emp','empname'));
    }
    else{
        $emp = Attendance::whereBetween('attendence_date', [$request->from, $request->to])
        ->where('employe_id',$request->employe_id)->get();
        return view('pages.Attendance.attendance_report',compact('emp','empname'));
    }
}

attendance_report.blade.php

<form method="post"  action="{{ route('attendance.search') }}" autocomplete="off" id="sh11">
    @csrf
    <div class="row">
        <div class="col-md-3">
            <div class="form-group">
                <select class="custom-select mr-sm-2"name="employe_id">
                    <option value="0">all</option>
                    @foreach($empname as $empname)
                        <option value="{{ $empname->id }}">{{$empname->employe_name }}</option>
                    @endforeach
                </select>
            </div>
        </div>
        <div class="card-body datepicker-form">
            <div class="input-group" data-date-format="yyyy-mm-dd">
                <span class="input-group-addon">Date</span>
                <input type="text"  class="form-control range-from date-picker-default" value={{ date('Y-m-d') }} required name="from">
                <span class="input-group-addon">to date</span>
                <input class="form-control range-to date-picker-default"  value={{ date('Y-m-d') }} type="text" required name="to">
            </div>
        </div>
    </div>
    <button class="btn btn-success btn-sm nextBtn btn-lg pull-right" type="submit">{{trans('Students_trans.submit')}}</button>
</form>

@isset($emp)
<div class="table-responsive">
    <table id="datatable" class="table  table-hover table-sm table-bordered p-0" data-page-length="50"
           style="text-align: center">
        <thead>
        <tr>
            <th class="alert-success">#</th>
            <th class="alert-success">code</th>
            <th class="alert-success">name</th>
            <th class="alert-success">work_time</th>
            <th class="alert-success">attendence_date</th>
            <th class="alert-warning">###</th>
        </tr>
        </thead>
        <tbody>
        @foreach($emp as $EMP)
            <tr>
                <td>{{ $loop->index + 1 }}</td>
                <td>{{ $EMP->employe->employe_code }}</td>
                <td>{{ $EMP->employe->employe_name }}</td>
                <td>Hour  {{ $EMP->work_time }} </td>
                <td>{{ $EMP->attendence_date }}</td>
                <td>
                    @if($EMP->attendence_status == 0)
                        <span class="btn-danger">Presence</span>
                    @else
                        <span class="btn-success">Absence</span>
                    @endif
                </td>
            </tr>
        @endforeach
    </table>
</div>
@endisset

修改实现统计功能

1. 修复模型关联问题

先修正Attendance.php中的关联模型名(匹配类名首字母大写),避免关联查询失败:

public function employe()
{
    return $this->belongsTo('App\Models\Employe', 'employe_id');
}

2. 调整控制器查询逻辑

修改AttendanceController.php的attendanceSearch方法,实现按员工分组统计work_time总和:

public function attendanceSearch(Request $request){
    $empname = Employe::get();
    
    // 可选:添加日期格式验证,增强健壮性
    $request->validate([
        'from' => 'required|date',
        'to' => 'required|date|after_or_equal:from',
    ]);

    if($request->employe_id == 0){
        // 统计所有员工的总工时,按员工ID分组
        $emp = Attendance::whereBetween('attendence_date', [$request->from, $request->to])
            ->select('employe_id', \DB::raw('SUM(work_time) as total_work_time'))
            ->groupBy('employe_id')
            ->with('employe') // 预加载员工信息,避免N+1查询
            ->get();
    } else {
        // 统计单个员工的总工时
        $totalWorkTime = Attendance::whereBetween('attendence_date', [$request->from, $request->to])
            ->where('employe_id', $request->employe_id)
            ->sum('work_time');
        
        // 封装数据结构,和批量统计保持一致,方便视图统一处理
        $emp = collect([
            (object)[
                'employe' => Employe::find($request->employe_id),
                'total_work_time' => $totalWorkTime
            ]
        ]);
    }

    return view('pages.Attendance.attendance_report', compact('emp', 'empname'));
}

3. 更新视图展示统计结果

修改attendance_report.blade.php中的表格部分,展示员工总工时:

@isset($emp)
<div class="table-responsive">
    <table id="datatable" class="table  table-hover table-sm table-bordered p-0" data-page-length="50"
           style="text-align: center">
        <thead>
        <tr>
            <th class="alert-success">#</th>
            <th class="alert-success">code</th>
            <th class="alert-success">name</th>
            <th class="alert-success">Total Work Time (Hours)</th>
        </tr>
        </thead>
        <tbody>
        @foreach($emp as $EMP)
            <tr>
                <td>{{ $loop->index + 1 }}</td>
                <td>{{ $EMP->employe->employe_code }}</td>
                <td>{{ $EMP->employe->employe_name }}</td>
                <td>{{ $EMP->total_work_time }}</td>
            </tr>
        @endforeach
    </table>
</div>
@endisset

如果需要同时展示每日考勤明细和总工时,可修改视图为:

@isset($emp)
@if(request()->employe_id != 0)
<!-- 每日考勤明细 -->
<div class="table-responsive mb-3">
    <h5>每日考勤明细</h5>
    <table class="table table-hover table-sm table-bordered p-0" style="text-align: center">
        <thead>
        <tr>
            <th>#</th>
            <th>Date</th>
            <th>Work Time (Hours)</th>
            <th>Status</th>
        </tr>
        </thead>
        <tbody>
        @foreach(Attendance::whereBetween('attendence_date', [request()->from, request()->to])->where('employe_id', request()->employe_id)->get() as $record)
            <tr>
                <td>{{ $loop->index + 1 }}</td>
                <td>{{ $record->attendence_date }}</td>
                <td>{{ $record->work_time }}</td>
                <td>
                    @if($record->attendence_status == 0)
                        <span class="btn-danger">Presence</span>
                    @else
                        <span class="btn-success">Absence</span>
                    @endif
                </td>
            </tr>
        @endforeach
        </tbody>
    </table>
</div>
@endif

<!-- 总工时统计 -->
<div class="table-responsive">
    <h5>总工时统计</h5>
    <table class="table table-hover table-sm table-bordered p-0" style="text-align: center">
        <thead>
        <tr>
            <th>#</th>
            <th>code</th>
            <th>name</th>
            <th>Total Work Time (Hours)</th>
        </tr>
        </thead>
        <tbody>
        @foreach($emp as $EMP)
            <tr>
                <td>{{ $loop->index + 1 }}</td>
                <td>{{ $EMP->employe->employe_code }}</td>
                <td>{{ $EMP->employe->employe_name }}</td>
                <td>{{ $EMP->total_work_time }}</td>
            </tr>
        @endforeach
    </table>
</div>
@endisset

内容的提问来源于stack exchange,提问作者amr_khlousy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:01:00