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

如何在Laravel Blade表格的指定列中动态创建子行

实现员工休假类型子行的解决方案

要实现每位员工对应多条休假类型子行的表格,需要从后端数据关联和前端表格单元格合并两部分处理:

1. 后端模型关联与数据查询

首先确保你的Eloquent模型建立正确关联,假设通过中间表employee_leaves存储员工的休假额度、已用天数和余额(字段包含employee_id, leave_type_id, entitled, used, balance):

模型关联代码

  • Employee 模型:
public function employeeLeaves()
{
    return $this->hasMany(EmployeeLeave::class);
}
  • EmployeeLeave 模型:
public function leaveType()
{
    return $this->belongsTo(LeaveType::class);
}

控制器查询数据

预加载关联数据避免N+1查询问题,同时将部门、职位数据转为ID键名的集合,简化视图逻辑:

$users = User::with('employeeLeaves.leaveType')->get();
$designations = Designation::all()->keyBy('id');
$departments = Department::all()->keyBy('id');

return view('your-view-name', compact('users', 'designations', 'departments'));

2. 修改Blade视图代码

利用HTML的rowspan属性合并员工基础信息单元格,内层循环遍历该员工的所有休假记录:

<table class="table table-bordered mb-0" id="myTable">
    <thead class="bg-orange">
        <tr class="text-light">
            <th>#</th>
            <th>Employee Name</th>
            <th>Employee Id</th>
            <th>Employee Type</th>
            <th>Leave Type</th>
            <th>Entitled</th>
            <th>Used Leave</th>
            <th>Balance</th>
        </tr>
    </thead>
    <tbody>
        @foreach($users as $index => $user)
            @php $leaveRecordCount = $user->employeeLeaves->count(); @endphp
            
            {{-- 员工基础信息行,合并对应行数的单元格 --}}
            <tr>
                <th scope="row" rowspan="{{ $leaveRecordCount }}">{{ $index + 1 }}</th>
                <td rowspan="{{ $leaveRecordCount }}">
                    {{ $user->name }} <br>
                    {{ $designations[$user->designationId]->designationName }} <br>
                    {{ $departments[$user->departmentId]->departmentName }}
                </td>
                <td rowspan="{{ $leaveRecordCount }}">{{ $user->employeeId }}</td>
                <td rowspan="{{ $leaveRecordCount }}">{{ $designations[$user->designationId]->attendanceType }}</td>
                
                {{-- 第一条休假记录 --}}
                @if($leaveRecordCount > 0)
                    <td>{{ $user->employeeLeaves[0]->leaveType->name }}</td>
                    <td>{{ $user->employeeLeaves[0]->entitled }}</td>
                    <td>{{ $user->employeeLeaves[0]->used }}</td>
                    <td>{{ $user->employeeLeaves[0]->balance }}</td>
                @else
                    <td colspan="4">No leave types assigned</td>
                @endif
            </tr>
            
            {{-- 剩余休假记录行,仅显示休假相关列 --}}
            @for($i = 1; $i < $leaveRecordCount; $i++)
                <tr>
                    <td>{{ $user->employeeLeaves[$i]->leaveType->name }}</td>
                    <td>{{ $user->employeeLeaves[$i]->entitled }}</td>
                    <td>{{ $user->employeeLeaves[$i]->used }}</td>
                    <td>{{ $user->employeeLeaves[$i]->balance }}</td>
                </tr>
            @endfor
        @endforeach
    </tbody>
</table>

核心要点

  • rowspan属性:将员工基础信息的单元格合并为休假记录数量行,确保基础信息只展示一次。
  • 数据查询优化:将部门、职位数据转为ID键名的集合,避免视图中嵌套循环判断,提升性能和代码可读性。
  • 空状态处理:当员工无休假记录时,用colspan合并后续4列,给出明确提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:30:47