Blade foreach l oop при пустом выдает ошибку - PullRequest
1 голос
/ 13 июля 2020

Я не могу понять, почему это не работает.

У меня есть отношение «многие ко многим» в Laravel между двумя моделями для публикации и тега.

При отображении сообщение У меня есть этот код в моем шаблоне клинка:

@if(!empty($page->tags))
    @foreach($page->tags as $tag)
        @if($loop->last)
            {{$tag->name}}
        @else
            {{$tag->name}},
        @endif
    @foreach
@endif

Однако, когда в сообщении нет тегов, он выдает эту ошибку:

Неопределенное смещение: 1 Освещение \ Foundation \ Bootstrap \ HandleExceptions :: handleError vendor / laravel / framework / src / Illuminate / View / Compilers / Concerns / CompilesLoops. php: 95

Если я закомментирую foreach l oop, все в порядке. Но из-за оператора if foreach l oop не должен запускаться, но, по-видимому, пытается это сделать. Я также пробовал другие выражения в своем операторе if, включая

@if(count($page->tags) > 0)

и

@if(null !== $page->tags)

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

если я dd ($ page-> tags), он показывает просто пустой массив, поэтому я не понимаю, почему это не сработает .

1 Ответ

0 голосов
/ 13 июля 2020

Вы не закрываете свой @foreach, вы использовали второй. Но, пожалуйста, примите во внимание информацию ниже!

@if(!empty($page->tags))
    @foreach($page->tags as $tag)
        @if($loop->last)
            {{$tag->name}}
        @else
            {{$tag->name}},
        @endif
    @endforeach
@endif

*** Связанные и, возможно, полезные для подобных ошибок **

Ваша проблема заключается в том, что вы получаете коллекцию с помощью $ page-> теги, и он не взаимодействует с empty () так, как вы думаете.

In php:

$obj = (object) [];
empty($obj);

// returns false

И laravel Collection является объектом, поэтому даже если теги $ page-> не содержат элементов, вы, по сути, делаете:

empty(collect())
// returns false

Если вы можете гарантировать, что теги $ page-> всегда установлены, вы можете использовать метод сбора:

@if($page->tags->isNotEmpty())
@endif

Однако, если иногда теги $ page-> имеют значение null (ie теги не загружаются на страницу), вы можете использовать:

@if(isset($page->tags))
@endif

Все это сказано, ЕСЛИ Теги $ page-> всегда присутствуют (загружаются), тогда синтаксис @foreach не должен ошибаться, поскольку Collection является итеративным и будет эквивалентно выполнению foreach ([] as $item) {}.

...