Есть ли какой-нибудь способ зациклить 2 foreach и один цикл for вместе?

#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. Именно то, что я хотел!