Blade foreach 循环在空时抛出错误

我不明白为什么这不起作用。


我在 Laravel 中的 Post 和 Tag 两个模型之间存在多对多关系。


显示帖子时,我的刀片模板中有以下代码:


@if(!empty($page->tags))

    @foreach($page->tags as $tag)

        @if($loop->last)

            {{$tag->name}}

        @else

            {{$tag->name}},

        @endif

    @foreach

@endif

但是,当帖子上没有标签时,它会抛出此错误:


未定义的偏移量:1

Illuminate\Foundation\Bootstrap\HandleExceptions::handleError

供应商/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLoops.php:95


如果我注释掉 foreach 循环,一切都很好。但由于 if 语句, foreach 循环不应该运行,但显然试图运行。我在 if 语句中也尝试了其他表达式,包括


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


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

似乎没有任何作用。我不知道如何优雅地处理标签的缺失。


如果我 dd($page->tags) 它显示它只是一个空数组,所以我不明白为什么这不起作用。


慕莱坞森
浏览 113回答 1
1回答

慕妹3146593

您没有关闭您的@foreach,您使用了第二个。但请考虑以下信息!@if(!empty($page->tags))    @foreach($page->tags as $tag)        @if($loop->last)            {{$tag->name}}        @else            {{$tag->name}},        @endif    @endforeach@endif*** 相关且可能对类似错误有用 **这里的问题是您正在使用 $page->tags 获取 Collection,并且它不会像您想象的那样与 empty() 交互。在 PHP 中:$obj = (object) [];empty($obj);// returns falseLaravel Collection 是一个对象,因此即使 $page->tags 中没有任何项目,您实际上也在做:empty(collect())// returns false如果您可以保证 $page->tags 始终被设置,那么您可以使用收集方法:@if($page->tags->isNotEmpty())@endif但是,如果有时 $page->tags 为空(即标签未加载到页面上),那么您可以使用:@if(isset($page->tags))@endif综上所述,如果 $page->tags 始终存在(已加载),则 @foreach 语法不应出错,因为 Collection 是可迭代的,并且相当于执行foreach ([] as $item) {}.
打开App,查看更多内容
随时随地看视频慕课网APP