Как пропустить отношения, если данных не существует? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть модели Event и Invitation с взаимосвязью между ними: у события может быть много приглашений.

Я пытаюсь показать только те события, у которых есть приглашения, если нет,просто пропустите событие.

Моя Event модель:

class Event extends Model
{   
    public function invitations()
    {
        return $this->hasMany(Invitation::class, 'event_id') ?? [];   
}

Я пытался использовать ?? [], если связь не существует, возврат пустого массива не работает.

Вот мой взгляд:

@if ($event->invitations != null)
    @foreach ($event->invitations as $event)
        <h5>{{ $event->email }}</h5>
    @endforeach
@else
    <h5>Not Found</h5>
@endif

Он не проходит через оператор else.

Как мне написать его, чтобы перейти в оператор else, когда $event->invitations не существует?

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Возвращенный результат метода invitations() является коллекцией, поэтому, когда вы делаете $event->invitations != null, он всегда будет true, даже если нет приглашения для определенного события (пустая коллекция отличается от null).

Я скорее предлагаю вам проверить размер коллекции в вашем состоянии:

@if ($event->invitations->count())
    @foreach ($event->invitations as $event)
        <h5>{{ $event->email }}</h5>
    @endforeach
@else
    <h5>Not Found</h5>
@endif

Или ярлык:

@empty ($event->invitations)
    <h5>Not Found</h5>
@else
    @foreach ($event->invitations as $event)
        <h5>{{ $event->email }}</h5>
    @endforeach
@endempty

Или даже самое короткое:

@forelse ($event->invitations as $event)
    <h5>{{ $event->email }}</h5>
@empty
    <h5>Not Found</h5>
@endforelse
2 голосов
/ 10 мая 2019

Если вы хотите получать только события с приглашениями, вы можете использовать has:

$events = Event::has('invitations')->get();
...