Атрибут доступа в Laravel Blade, используя firstWhere - PullRequest
0 голосов
/ 16 марта 2020

У меня в настоящее время есть этот код на моем Blade:

@if ($employees->count() > 0)
    <table class="table table-bordered table-responsive">
        <thead>
        <th>Employee</th>
        <!-- Format of date_of_shift field: format('Y-m-d') -->
        <th>{{ $day1 }}<br />{{ $day1_day }}</th>
        <th>{{ $day2 }}<br />{{ $day2_day }}</th>
        <th>{{ $day3 }}<br />{{ $day3_day }}</th>
        <th>{{ $day4 }}<br />{{ $day4_day }}</th>
        <th>{{ $day5 }}<br />{{ $day5_day }}</th>
        <th>{{ $day6 }}<br />{{ $day6_day }}</th>
        <th>{{ $day7 }}<br />{{ $day7_day }}</th>
        </thead>
        <tbody>
        @foreach ($employees as $employee)
            <tr>
            @if (!$employee->user->last_name)
                <td>{{ $employee->user->first_name }} {{ $employee->user->maiden_name }} </td>
            @else
                <td>{{ $employee->user->last_name }}, {{ $employee->user->first_name }} {{ $employee->user->maiden_name }} </td>
            @endif
                @for ($sched = 0; $sched < 7; $sched++)
                    @if ($employee->schedule->count() > 0)
                    <td>{{ $employee->schedule->firstWhere('date_of_shift', '=', \Carbon\Carbon::today()->addDays($sched)->format('Y-m-d') ) }}</td>
                    @endif
                @endfor
            </tr>
        @endforeach
        </tbody>
    </table>
@elseif ($employees->count() == 0 && $user->is_staff == 'True')
    <p>No employees found. <a href="{{ route('employees.create') }}">Wanna create one now?</a></p>
@elseif ($employees->count() == 0 && $user->is_staff == 'False')
    <p>No employees found.</p>
@endif

Контроллер

        $from = date('2020-03-16');
        $to = date('2020-03-22');

        $employees = Employee::join('users', 'users.id', 'employees.user_id')->where('employees.is_active', 'True')->orderBy('users.last_name', 'asc')->paginate(6);

        $schedules = Schedule::whereBetween('date_of_shift', [$from, $to])->groupBy('date_of_shift', 'employee_id')->orderBy('date_of_shift', 'asc')->distinct()->get();

Мои строки td выводят что-то вроде

{"id":1,"user_id":4,"employee_id":4,"time_of_shift":"6:00 AM - 5:00 PM","date_of_shift":"2020-03-20","created_at":"2020-03-17 02:20:12","updated_at":"2020-03-17 02:20:12"}

Я хотел получить поле time_of_shift и отобразить его на виде. Я пытался использовать

<td>{{ $employee->schedule->firstWhere('date_of_shift', '=', \Carbon\Carbon::today()->addDays($sched)->format('Y-m-d') )->first()->time_of_shift }}</td>

Но это просто дает мне ошибку. Как мне это сделать? Или есть другой способ сделать это вокруг?

1 Ответ

0 голосов
/ 17 марта 2020

Во-первых, я хотел бы выполнить загрузку:

$employees = Employee::with('schedules')->where('employees.is_active', 'True')->orderBy('users.last_name', 'asc')->paginate(6);

Затем,

foreach($employees as $employee){
 $current_schedule = $employee->schedule->latest();
 $employee->time_of_shift = $current_schedule->time_of_shift;
}

Теперь, когда вы в вашем представлении, так как вы создали новый атрибут для каждого экземпляра коллекции сотрудников с именем time_of_shift вы можете просто выполнить $employee->time_of_shift, и вам не придется беспокоиться о сумасшедшей фильтрации коллекций внутри самого представления. У каждого сотрудника, которого вы * oop, будет собственный атрибут "time_of_shift", основанный на последнем расписании, связанном с ним в базе данных.

...