0

0

Laravel 团队缺勤日历:高效渲染用户月度缺席表格

霞舞

霞舞

发布时间:2026-01-12 18:11:01

|

888人浏览过

|

来源于php中文网

原创

Laravel 团队缺勤日历:高效渲染用户月度缺席表格

本文介绍如何在 laravel 中正确构建团队缺勤日历表格,解决因多重缺席记录导致的重复单元格与表格结构崩溃问题,通过预计算每日缺席状态实现清晰、高性能的 blade 渲染。

在 Laravel 中实现团队级缺勤日历(如按日显示每位成员的出勤/缺席状态),关键在于避免在视图中嵌套循环判断——尤其是对每个用户、每天、每条缺席记录进行三重遍历,这不仅逻辑混乱、性能低下,还会因重复

输出直接破坏 HTML 表格结构(如你遇到的“天数翻倍、表格崩溃”问题)。

根本原因在于原始 Blade 代码:

@foreach($days as $day)
    @foreach ($user->absences as $absence)  {{-- ❌ 对每个 absence 都输出一个  --}}
        @if($day >= ... && $day <= ...)
            x
        @else
            o
        @endif
    @endforeach
@endforeach

当某用户有 2 条缺席记录(如 5–7 和 12–14),且当前 $day = 6,则会触发两次判断并输出两个

,彻底打乱单日一列的语义。

✅ 正确解法:将“某用户在某日是否缺席”抽象为布尔查询,并在控制器中预计算好所有用户的缺席日期集合

AI Time Machine
AI Time Machine

使用AI创建穿越历史的超逼真的头像

下载

步骤一:控制器中预聚合缺席日期(推荐使用 Carbon + Collection)

假设你已获取 $users(含 absences 关系)和 $days(如 range(1, 31)):

// 在控制器中(例如 UserController@index)
$users = User::with('absences')->get()->map(function ($user) {
    // 将所有缺席区间展开为具体日期数组(格式化为 'Y-m-d' 更健壮,避免仅用 'd' 的跨月歧义)
    $absenceDays = $user->absences->flatMap(function ($absence) {
        return collect(
            range(
                $absence->start->startOfMonth()->diffInDays($absence->start) + 1,
                $absence->end->startOfMonth()->diffInDays($absence->end) + 1
            )
        )->filter(function ($d) use ($absence) {
            // 确保只取当月日期(防跨月数据污染)
            return $d >= $absence->start->day && $d <= $absence->end->day;
        });
    })->values()->toArray();

    $user->absenceDays = array_unique($absenceDays); // 去重(防区间重叠)
    return $user;
});
✅ 更优实践(强烈推荐):使用 CarbonPeriod 处理日期区间use Carbon\CarbonPeriod; $users = User::with('absences')->get()->map(function ($user) { $absenceDays = collect(); foreach ($user->absences as $absence) { $period = CarbonPeriod::create($absence->start, $absence->end); foreach ($period as $date) { if ($date->month === now()->month) { // 限定当月 $absenceDays->push($date->day); } } } $user->absenceDays = $absenceDays->unique()->sort()->values()->toArray(); return $user; });

步骤二:Blade 中简洁渲染(无嵌套循环)


            @foreach ($days as $day)
                
            @endforeach
        
        @foreach ($users as $user)
            
                @foreach ($days as $day)
                    @if (in_array($day, $user->absenceDays ?? []))
                        
                    @else
                        
                    @endif
                @endforeach
            
        @endforeach
    
姓名{{ $day }}
{{ $user->name }}xo

⚠️ 注意事项与进阶建议

  • 跨月处理:原始方案仅用 format('d') 会丢失月份信息,导致 2024-01-31 和 2024-02-01 被视为同一天(31 vs 1)。务必在数据库查询或模型作用域中限定当月数据,或改用完整日期比对。
  • 性能优化:若用户量大,可考虑使用 Eloquent 的 whereHas() 配合 DB::raw() 在数据库层聚合缺席日期(如 PostgreSQL 的 UNNEST + GENERATE_SERIES),但对中小型应用,内存中 Collection 处理已足够高效。
  • 可扩展性:后续支持“部分缺席”(如上午/下午)、多状态(病假/事假/调休)时,可将 absenceDays 改为关联数组 ['5' => 'sick', '12' => 'vacation'],并在 Blade 中动态渲染图标或颜色。
  • 前端增强:配合 Alpine.js 或 Livewire 可实现按月切换、点击查看详情等交互,无需刷新页面。

通过将业务逻辑移出视图、预计算状态集合,你不仅修复了表格结构错误,更获得了可维护、可测试、可扩展的日历组件基础。这是 Laravel “逻辑在控制器,展示在视图”原则的典型实践。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

316

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

271

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

368

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

367

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

605

2023.06.14

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号