从单个MySQL表中重组Laravel中的数据



>我在单个MySQL表中有一些示例数据,该表具有字段schedule_id, day_number, staff_id, shift_start_time, shift_end_time, hours_worked

在MVC和Laravel开发方面,我仍然相对缺乏经验,所以我正在寻找一些关于如何最好地解决这个问题的指导。

我需要做的是在表格中显示数据,使其格式类似于以下内容:-

<table style="border: 1px solid black; text-align: center">
<tr>
<th>Staff ID</th>
<th>Day 0</th>
<th>Day 1</th>
<th>Day 2</th>
<th>Day 3</th>
<th>Day 4</th>
<th>Day 5</th>
<th>Day 6</th>
</tr>

<tr>
<td>21</td>
<td>12:00:00 - 17:00:00</td>
<td>12:00:00 - 19:00:00</td>
<td>12:00:00 - 13:00:00</td>
<td></td>
<td>12:00:00 - 15:00:00</td>
<td>12:00:00 - 17:00:00</td>
<td>12:00:00 - 16:00:00</td>
</tr>

<tr>
<td>24</td>
<td></td>
<td></td>
<td>11:00:00 - 19:00:00</td>
<td>11:00:00 - 13:00:00</td>
<td>10:00:00 - 15:00:00</td>
<td>12:00:00 - 17:00:00</td>
<td>12:00:00 - 16:00:00</td>
</tr>
<tr>
<td>32</td>
<td>11:00:00 - 19:00:00</td>
<td>11:00:00 - 13:00:00</td>
<td>10:00:00 - 15:00:00</td>
<td>12:00:00 - 17:00:00</td>
<td>12:00:00 - 16:00:00</td>
<td></td>
<td></td>
</tr>
</table>

我的理解是,任何数据转换或过滤都应该在模型中进行(与保持控制器苗条一致(。我第一次尝试检索所有数据并开始在边栏选项卡模板中编写@foreach@while循环,但这会导致代码混乱,并且不可维护且难以修改以备将来使用。

就最佳实践而言,我应该做什么?我考虑的一些选择是创建另一个表,这可能会让我在未来具有灵活性,但代价是现在的复杂性。

我考虑的另一个选项是首先使用 Eloquent 的内置方法在staff_id上进行groupBy(),然后创建一个关联数组,其格式类似于我需要在刀片模板中构建的格式。

数据库查询groupBy可能不会执行您需要的操作。我假设您有一个"员工"表,您在问题中显示的此表与该表有关系。我还假设您定义了员工和相关关系的模型。这个想法是收集工作人员及其相关的时间表条目,并将它们写在一个表格中。

在控制器中(或获取数据的任何位置(:

$staffData = Staff::with([ "schedule" => function ($query) {
$query->orderBy("day_number");       
}])->get();
$dayCount = $staffData->reduce(function($result, $staff) {
return (is_null($result) || $staff->schedule->max("day_number") > $result) ? $staff->schedule->max("day_number") : $result;
});
return view("theview", compact("staffData","dayCount"));

在视图中:

<table style="border: 1px solid black; text-align: center">
<tr>
<th>Staff ID</th>
@for ($i = 0;$i < $dayCount;$i++) 
<th>Day {{$i}}</th>
@endfor
</tr>
@foreach ($staffData as $staffEntry) 
<tr> 
<td>{{$staffEntry->id}}</td>
@for ($i = 0;$i < $dayCount;$i++)
@php $dayEntry = $staffEntry->schedule->where("day_number",$i)->first(); @endphp   
<td>{{$dayEntry?$dayEntry->shift_start_time:""}}-{{$dayEntry?$dayEntry->shift_end_time:""}}</td>
@endfor
</tr>
@endforeach

最新更新