Свойство не существует в этом экземпляре коллекции. (Laravel 6) - PullRequest
0 голосов
/ 10 марта 2020

У меня есть for-l oop, который добавляет <td> строк в мою таблицу. Проблема в том, что я не могу получить доступ к атрибутам моей модели расписания, и она продолжает давать мне

Свойство [date_of_shift] не существует в этом экземпляре коллекции.

    <table class="table table-bordered table-responsive">
        <thead>
        <th>Employee</th>
        <!-- Format of date_of_shift field: format('Y-m-d') -->
        @for ($i = 0; $i < 7; $i++)
            <th>
                {{ \Carbon\Carbon::today()->addDays($i)->format('F j, Y') }}<br />
                {{ \Carbon\Carbon::today()->addDays($i)->format('D') }}
            </th>
        @endfor
        </thead>
        <tbody>
        @foreach ($employees as $employee)
            <tr>
                <td>{{ $employee->user->last_name }}, {{ $employee->user->first_name }} {{ $employee->user->maiden_name }} </td>
                @for ($j = 0; $j < 7; $j++)
                    @if ( $employee->schedule->date_of_shift == \Carbon\Carbon::today()->addDays($j)->format('Y-m-d') )
                        <td>{{ $employee->schedule->time_of_shift }}</td>
                    @else
                        <td><strong>REST DAY</strong></td>
                    @endif
                @endfor
            </tr>
        @endforeach
        </tbody>
    </table>

Сотрудник. php

public function schedule () {
    return $this->hasMany('App\Schedule');
}

Расписание. php

public function employee () {
    return $this->belongsTo('App\Employee');
}

Какой обходной путь для этого?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020
Employee.php

public function schedules () {
    return $this->hasMany('App\Schedule');
}

Schedule.php

public function employees () {
    return $this->belongsTo('App\Employee');
}

И в соответствии с этим у сотрудника может быть много расписаний, поэтому вы не можете делать так:

@if ( $employee->schedules->date_of_shift == \Carbon\Carbon::today()->addDays($j)->format('Y-m-d') )
  <td>{{ $employee->schedules->time_of_shift }}</td>
@else

Вы должны использовать @foreach, если хотите проверить много расписаний

Вы можете попробуйте это

@foreach($employee->schedules as $schedule)
   @if ( $schedule->date_of_shift == \Carbon\Carbon::today()->addDays($j) 
        >format('Y-m-d') )
     <td>{{ $schedule->time_of_shift }}</td>
   @else
@endforeach

Но если вам нужен самый последний, вы можете просто использовать метод first (), как этот

@if ( $employee->schedule->first()->date_of_shift == \Carbon\Carbon::today()->addDays($j) 
            >format('Y-m-d') )
   <td>{{ $employee->schedule->first()->time_of_shift }}</td>
@else

Но в случае расписания. Он принадлежит одному сотруднику, поэтому вам не нужно использовать foreach Спасибо. Дайте мне знать, если это поможет

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

Поскольку ваши отношения HasMany, $employee->schedule возвращает экземпляр коллекции, поэтому в вашем случае самое простое, что вы можете сделать, это получить ->first() результат коллекции ...

@if ( $employee->schedule->first()->date_of_shift == \Carbon\Carbon::today()->addDays($j)->format('Y-m-d') )
    <td>{{ $employee->schedule->first()->time_of_shift }}</td>
@else
    <td><strong>REST DAY</strong></td>
@endif

ИЛИ

Или не меняйте код в своем блейде, вместо этого измените отношение с HasMany на HasOne

public function schedule () {
    return $this->hasOne('App\Schedule');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...