Laravel table 中显示的缺勤日历问题

Laravel calendar of absences problem with displaying in table

我想创建团队缺勤日历。每个用户可以在特定月份定义多个缺席。

然后我想像这样在 table 中为每个人打印它(例如 10 天):

Day   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
-----------------------------------------------|
User1 | o | o | x | x | x | x | o | o | o | x  |
-----------------------------------------------|
User2 | x | o | o | o | x | x | o | x | o | x  |
-----------------------------------------------|

其中“o”代表正常的一天,“x”定义为缺勤。

我得到了用户 table 和缺席 table:

Users
id | name 

Absences
id | user_id | start | end

我获取当前月日值并遍历所有用户,然后像这样遍历 blade 中的天数:

@foreach ($users as $user )
   <tr>
      <td> {{ $user->name }} </td>
   @if($user->absences != null)
      @foreach($days as $day)
         @foreach ($user->absences as $absence)
           @if($day >= $absence->start->format('d') && $day <= $absence->end->format('d'))
              <td style="background: red"> x </td>
           @else
              <td style="background: blue"> o </td>
           @endif
         @endforeach
       @endforeach
    @endif
  </tr>
@endforeach

问题是,如果用户定义了不止一次缺勤,他列中的天数就会翻倍,整个 table 都会崩溃。当用户只有 1 次缺席时,它工作正常。

您知道如何更轻松地实现这一点吗?

你的问题出在@foreach ($user->absences as $absence)循环中。您正在检查一天的所有缺勤。

相反,您应该使用一个函数来获取用户的所有缺席天数。我认为在控制器中保留这样的功能是一个更好的主意。

$users = $users->map(function ($user) {
    $user['absenseDays'] = $user->absences->reduce(function ($carry, $item) {
        return [...$carry, ...range($item['start'], $item['end'])];
    }, []);
    return $user;
});

这应该为每个用户创建一个新的 absenseDays 条目,值应该是一组缺席天数。假设一个用户有 2 条记录 5-8 和 12-14,absenseDays 应该是 [5,6,7,8,12,13,14].

在blade中你只需要:

@if (in_array($day, $user->absenseDays))
    <td style="background: red"> x </td>
@else
    <td style="background: blue"> o </td>
@endif

我这里直接写了函数。所以它可能不起作用,或者可能是产生相同输出的更好方法。但我可以肯定地说,生成 absenseDays 数组是我能想到的最好方法。