Laravel:如何基于两个日期间的时间段生成对应统计表格
问题原因
你遇到的问题根源是 Carbon实例是可变对象:表头渲染的for循环中,你直接修改了原始$from变量的值,等表头渲染完成时,$from已经被增加到晚于$to的日期。后续渲染tbody学生行的日期循环时,$i <= $to的初始判断条件直接不成立,所以不会渲染任何日期列。
解决方法
建议提前把需要渲染的所有日期生成固定的集合,后续表头和表体统一遍历这个集合即可,既避免重复处理日期,也不会出现变量污染的问题。
修改后的完整Blade代码如下:
@php use Carbon\Carbon; $from = Carbon::parse($from); $to = Carbon::parse($to); // 预生成所有要展示的日期集合,不修改原始$from变量 $dates = collect(); $current = $from->copy(); while ($current->lte($to)) { $dates->push($current->copy()); $current->addDay(); } // 可选优化:把每日统计数据处理成 姓名_日期 为键的映射,方便单元格快速查找 $dailyMap = $daily->keyBy(fn($item) => $item->name . '_' . $item->date); @endphp <div class="container text-right" dir="rtl"> <table class="table"> <thead> <tr> <td>#</td> <td>ناڤ</td> <!-- 直接遍历预生成的日期集合 --> @foreach($dates as $date) <td>{{ $date->format('m/d') }}</td> @endfor </tr> </thead> <tbody> @php $counter = 1; @endphp @foreach ($students as $student) <tr> <td>{{ $counter }}</td> <td>{{ $student->name }}</td> <!-- 同样遍历预生成的日期集合 --> @foreach($dates as $date) @php $mapKey = $student->name . '_' . $date->toDateString(); @endphp <!-- 这里可以根据你的需求显示统计值、yes/no等 --> <td>{{ isset($dailyMap[$mapKey]) ? $dailyMap[$mapKey]->counts : 0 }}</td> @endforeach </tr> @php $counter++; @endphp @endforeach </tbody> </table> </div>
如果你不想预生成日期集合,也可以在每次循环日期时用copy()方法创建Carbon副本,避免修改原始变量:把tbody里的循环改成@for ($i = $from->copy(); $i <= $to; $i->modify('+1 day'))即可,但更推荐预生成日期的方案,性能和可维护性更好。
内容的提问来源于stack exchange,提问作者Sermed mayi
相关产品推荐
相关产品推荐

