Почему не появляются очередные регистрации в конгрессах? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть UserController, у которого есть метод index (), который должен получать все регистрации в конгрессах пользователем и для каждой регистрации получать данные о конгрессе (название и дата). Так что в представлении «users.index» можно отобразить заголовок конгресса, дату и дату регистрации всех регистраций пользователей в конгрессах.

В таблице конгрессов есть столбец «end_congress_date», если «end_congress_date» все еще в прошлом, это означает, что конгресс еще не закончился, в противном случае это означает, что конгресс уже завершен.

Но не работает, никаких результатов не появляется. Ты знаешь почему?

Итак, у меня есть индекс () вроде:

class UserController extends Controller
{
    public function index(){
        $user = Auth::user();
        $registrations = $user->registrations()->with('congress')->get();
        return view('users.index', compact('user','registrations'));
    }
}

"dd($registrations);" показывает:

Collection {#281 ▼
  #items: array:17 [▼
    0 => Registration {#287 ▶}
    1 => Registration {#288 ▶}
    2 => Registration {#289 ▶}
  ]
}

index.blade.php:

 <ul class="list-group congresses-list" id="">
        @foreach($registrations->where('congress_end_date', '<=', \Carbon\Carbon::now()) as $reg)
            <li class="list-group-item">
                <p class="font-size-sm"><i class="fa fa-calendar" aria-hidden="true"></i>
                    {{$reg->congress->congress_start_date->formatLocalized('%a, %b %d, %Y - %H:%M')}}</p>
                <h5 class="card-title">{{$reg->congress->name}}</h5>
                <p> Registration done in {{$reg->created_at}}</p>
            </li>
    @endforeach
    </ul>

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Я бы рекомендовал добавить один или два вспомогательных метода в модель Congress, которые сообщают вам, закончился ли конгресс или нет. Я ожидаю, что это обычное требование в вашем приложении.

class Congress
{
    // other code

    public function isFinished(): bool
    {
        return $this->congress_end_date < now();
    }
}

(Ожидается, что на модели вы получите $dates = ['congress_end_date', ...]).

Затем вы можете использовать метод filter() в вашей коллекции, чтобы получить все Registrations с Congress, которое уже закончено (или также наоборот):

@foreach($registrations->filter(function ($item) { return $item->congress->isFinished(); }) as $reg)
    // do something with the registrations of finished congresses
@endforeach

[необязательно: только если вам нужны не все регистрации, а только законченные]

Если вы не планируете использовать все предметы из $registrations, а только те, которые имеют законченный конгресс, я бы порекомендовал вам брать только те, которые вам нужны. Вы можете сделать это в вашем контроллере, поменяв местами

$registrations = $user->registrations()->with('congress')->get();

в пользу

$registrations = $user->registrations()
    ->with('congress')
    ->whereHas(['congress' => function ($query) {
        $query->where('congress_end_date', '<', now());
    }])
    ->get();

Затем вы можете просто просмотреть их в своем представлении без фильтрации до:

@foreach($registrations as $reg)
    // ...
@endforeach
0 голосов
/ 05 мая 2018

Проблема в том, что вы пытаетесь зацикливаться на чем-то, что не существует:

@foreach($registrations->where('congress_end_date', '<=', \Carbon\Carbon::now()) as $reg)

Поле congress_end_date не существует в объекте registration , оно существует в отношении: конгресс. Таким образом, проверка if (если дата меньше, чем сейчас) не будет выполнена 100% времени. Таким образом ... регистрация не будет отображаться на странице users.index.

У вас есть несколько вариантов, вы можете извлекать данные из БД на конгрессе (при условии, что у вас есть связь с регистрациями), или, возможно, проще всего было бы зациклиться на $ регистрациях, как у вас, но убрать проверку даты из foreach Цикл и добавить проверку if на модель конгресса ниже. Примерно так (при условии, что отношение конгресса не много ко многим):

@foreach($registrations as $registration)
    if($registration->congress->congress_end_date < \Carbon\Carbon::now()))
        // do what you want with the congress model that hasn't ended yet here

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...