【问题标题】:Show days a week even though there's no data from database in Laravel即使 Laravel 中没有数据库中的数据,也可以显示一周的几天
【发布时间】:2022-01-24 21:23:18
【问题描述】:

我正在尝试制定时间管理计划。表格是这样的:

Days    | Start | End
Monday  | 08:00 | 11:00
Tuesday | 07:00 | 12:00
...

我想继续显示从 MondaySunday 的天数,即使在数据库中没有数据。

我希望结果是这样的:

Days    | Start | End   |
Monday  | 08:00 | 11:00 |
Tuesday | 07:00 | 12:00 |
...
Sunday  |   -   |   -   |  // if there's no sunday data in database it still 
                           // showing sunday but the start & end is empty

查询结果也有可能为null,因此最终会出错,因为稍后在视图中使用foreach时,变量内部没有任何值。

这是我的控制器:

$work_hours = AttendanceGroupWorkHour::where('attendance_group_id', $id)->get();

这是我的观点:

@foreach ($work_hours as $work_hour)
  <tr>
     <td> 
        {{ $work_hour->days)
     </td>
     <td>
        {{ $work_hour->start)
     </td>
     <td>
         {{ $work_hour->end)
      </td>
     </tr>
</tbody>
@endforeach

对不起,我真的不知道该怎么做。任何帮助都会对我有所帮助。

【问题讨论】:

  • 可以分享一下数据库表吗?
  • 如果数据库中没有数据,您想用空值显示周一到周日的日期吗?您只想一次显示 1 周?
  • @B.Grgr Days | Start | End数据库是这样的
  • @BernardWiesner 是的,我只想展示 1 周

标签: php laravel


【解决方案1】:

不要迭代 $work_hours,这可能会丢失您想要显示的日期,而是迭代一周中的几天(或开始/结束之间的日期,无论您在做什么)。作为演示,让我们在这周进行迭代。

在您的控制器中:

// First step is to make your $work_hours addressable.  Use keyBy()
// so that we can do something like $work_hours['Monday'].
$work_hours = AttendanceGroupWorkHour::where('attendance_group_id', $id)
    ->get()
    ->keyBy('days');

// Now let's build an array of every day this week - you would have
// to adjust this to match the dates in $work_hours.
$days = [];
$start = Carbon::now()->startOfWeek();
$end = Carbon::now()->endOfWeek();
for ($day = $start->copy(); $day->lte($end); $day->addDay()) {
    $days[] = $day->format('l'); // Eg "Monday"
}

// Now pass the full set of days to the view, along with your "data" days:
return view('some.view', [
    'days'       => $days,
    'work_hours' => $work_hours
]);

现在在你看来:

@foreach ($days as $day)
    <tr>
        <td>{{ $day }}</td>
        <td>@if (isset($work_hours[$day]) {{ $work_hours[$day]->start }} @endif</td>
        <td>@if (isset($work_hours[$day]) {{ $work_hours[$day]->end }} @endif</td>
    </tr>
@endforeach

【讨论】:

  • 不管怎样,如果我还想从$work_hours 获取每个数据的id 怎么办?
  • $work_hours[$day]-&gt;id?如果你想看看你的$work_hours 长什么样,试试dd($work_hours);
  • 哦,我明白了...我只需要这样称呼它。感谢您的帮助,它正在工作
【解决方案2】:

我喜欢尽可能将逻辑保留在后端。我没有对其进行测试,但这应该可以,并且您可以使用相同的视图实现。

$workDays = AttendanceGroupWorkHour::where('attendance_group_id', $id)->get()->keyBy('days'); //make sure only 1 week is returned Monday to Sunday, would be better to add to your query a where clause
$daysOfWeek = ['Monday' => 0, 'Tuesday' => 1, 'Wednesday' => 2, 'Thursday' => 3, 'Friday' => 4, 'Saturday' => 5, 'Sunday' => 6];
$scheduledDays = [];

foreach($daysOfWeek as $dayOfWeek => $value){
    if(!isset($workDays[$dayOfWeek])){
        $scheduledDays[] = ['days' => $dayOfWeek, 'start' => '-', 'end' => '-'];
        continue;
    }
    $scheduledDays[] = ['days' => $workDays[$dayOfWeek]->days, 'start' => $workDays[$dayOfWeek]->start, 'end' => $workDays[$dayOfWeek]->end];
}
return view('your.view', [
    'scheduledDays' => $scheduledDays
]);

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多