#php #arrays #laravel #laravel-blade #laravel-collection
#php #массивы #laravel #laravel-blade #laravel-collection
Вопрос:
Я работаю над проектом Laravel 8, где я создам систему управления персоналом, поэтому сейчас я борюсь с отчетностью о посещаемости сотрудников. У меня есть 2 модели User.php
, а Attendance.php
также 2 контроллера и связь между моделями.
public function attendances()
{
return $this->hasMany(Attendance::class, 'user_id');
}
Это исходит от моего AttendanceController.php
public function index()
{
return view('frontend.attendances.index', [
'employees' => $this->userRepository->getAllUsers()
->with(['attendances' => function($query) {
$query->where('company_id', Auth::user()->company_id);
}])
->get()
]);
}
Итак, теперь я должен отобразить таблицу со всеми датами текущего месяца и показать, присутствовал ли каждый пользователь на работе или нет.
У меня это мой summary.blade.php
@foreach($employees as $employee)
<tr>
<td>
<img class="img-fluid rounded-circle mr-2" width="30" height="30" src="{{ $employee->image ? $employee->image : asset('assets/images/user.jpg') }}" alt="{{ $employee->firstname }}" data-original-title="{{ $employee->firstname }}">
{{ $employee->name() }}
</td>
@php($count=0)
@for($i=1; CarbonCarbon::now()->daysInMonth >= $i; $i )
@foreach($employee->attendances as $attendance)
@if($i == CarbonCarbon::createFromFormat('Y-m-d H:m:s', $attendance->check_in)->isoFormat('D'))
<td class="text-center"><i class="fa fa-check text-success"></i></td>
@php($count )
@else
<td class="text-center"><i class="fa fa-times text-danger"></i></td>
@endif
@endforeach
@endfor
<td class="text-success text-center">{{ $count }} / {{ CarbonCarbon::now()->daysInMonth }}</td>
</tr>
@endforeach
Это не так, как это должно работать, но я пробовал это многими способами и до сих пор не могу найти какой-то правильный способ.
Вот изображение того, чего я пытаюсь достичь, и что у меня есть с моим кодом
Комментарии:
1. В чем проблема? Что это должно показывать?
2. Он должен отображать данные так, как они есть на изображении. С текущими циклами он продолжается
<td>
для каждой посещаемости… В основном цикл проходит с 1 по 31 января и отображает только одну посещаемость, после этого он продолжается снова и показывает вторую посещаемость и т.д… итак, мой январь не заканчивается на 31-й день… у него будет столько посещений, сколько у меня есть (31 x посещений) Я обновил вопрос картинкой, чего я хочу достичь и что у меня есть3. Я думаю, что это комбинация 2 проблем: 1) У вас может не быть
Attendance
для каждого дня рассматриваемого месяца и 2) Вы загружаете каждую посещаемость в$employee->attendances
отношениях (даже те, которые не имеют отношения к текущему месяцу). Чтобы знать наверняка, требуется более подробная информация оAttendance
модели (миграция, приведения)
Ответ №1:
Как насчет чего-то подобного: перебирайте даты и фильтруйте посещаемость для сотрудника на основе даты.
//First, create a date period.
//use CarbonCarbon; use CarbonCarbonPeriod;
$daysOfThisMonth = CarbonPeriod::create(Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth());
//Loop through the days
foreach($daysOfThisMonth as $day){
//firstWhere will return one row if day exists in check_in field (equivalent to true), otherwise will return nothing, which will be equivalent to a false.
if( $employee->attendance->firstWhere('check_in', $day ) ) //formatthe dates according to your preference
echo "attended - print tick";
else
echo "not attended - print x";
}
Комментарии:
1. Именно то, что я хотел!