Php Blade foreach循环在为空时抛出错误

Php Blade foreach循环在为空时抛出错误,php,laravel,laravel-blade,Php,Laravel,Laravel Blade,我不明白这为什么不起作用 在Laravel中,Post和Tag的两个模型之间存在多对多关系 显示帖子时,我的刀片模板中有以下代码: @if(!empty($page->tags)) @foreach($page->tags as $tag) @if($loop->last) {{$tag->name}} @else {{$tag->name}}, @endif

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

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

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

@if(!empty($page->tags))
    @foreach($page->tags as $tag)
        @if($loop->last)
            {{$tag->name}}
        @else
            {{$tag->name}},
        @endif
    @foreach
@endif
但是,如果帖子上没有标签,则会抛出以下错误:

未定义的偏移量:1
Illumb\Foundation\Bootstrap\HandleExceptions::handleError
vendor/laravel/framework/src/illumb/View/Compilers/Concerns/CompilesLoops.php:95

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

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

似乎什么都不管用。我不知道如何优雅地处理标签的缺失


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

您没有关闭@foreach,您使用了第二个。但请考虑以下信息

@if(!empty($page->tags))
    @foreach($page->tags as $tag)
        @if($loop->last)
            {{$tag->name}}
        @else
            {{$tag->name}},
        @endif
    @endforeach
@endif
***对类似错误相关且可能有用**

这里的问题是,您使用$page->tags获取一个集合,而它与empty()的交互方式与您想象的方式不同

在php中:

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

// returns false
而laravel集合是一个对象,因此即使$page->tags中没有任何项目,您实际上也在做:

empty(collect())
// returns false
如果可以保证始终设置$page->tags,则可以使用收集方法:

@if($page->tags->isNotEmpty())
@endif
但是,如果有时$page->tags为空(即,页面上未加载标签),则可以使用:

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

综上所述,如果$page->tags始终存在(已加载),那么@foreach语法就不会出错,因为集合是可编辑的,这相当于执行
foreach([]作为$item){}
如果您没有关闭@foreach,那么您就使用了第二个。但请考虑以下信息

@if(!empty($page->tags))
    @foreach($page->tags as $tag)
        @if($loop->last)
            {{$tag->name}}
        @else
            {{$tag->name}},
        @endif
    @endforeach
@endif
***对类似错误相关且可能有用**

这里的问题是,您使用$page->tags获取一个集合,而它与empty()的交互方式与您想象的方式不同

在php中:

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

// returns false
而laravel集合是一个对象,因此即使$page->tags中没有任何项目,您实际上也在做:

empty(collect())
// returns false
如果可以保证始终设置$page->tags,则可以使用收集方法:

@if($page->tags->isNotEmpty())
@endif
但是,如果有时$page->tags为空(即,页面上未加载标签),则可以使用:

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

综上所述,如果$page->tags始终存在(已加载),那么@foreach语法就不会出错,因为集合是可编辑的,这相当于执行
foreach([]作为$item){}

我一定是在做其他错误的事情,我不知道是什么。@if($page->tags->isNotEmpty())和@if(isset($page->tags))都不工作,这是同一个错误。@user738974您能在引起问题的if内共享{dd($page->tags)}}吗?@user738974巴哈哈哈。我们都错过了。更新答案。是的,刚刚发生了……这就是为什么我知道已经太晚了……哈哈,谢谢你的帮助!就像那样,它可以工作,甚至没有if语句……很好的捕获…@user738974 np!我一定是做错了什么我不知道是什么。@if($page->tags->isNotEmpty())和@if(isset($page->tags))都不工作,这是同一个错误。@user738974您能在引起问题的if内共享{dd($page->tags)}}吗?@user738974巴哈哈哈。我们都错过了。更新答案。是的,刚刚发生了……这就是为什么我知道已经太晚了……哈哈,谢谢你的帮助!就像那样,它可以工作,甚至没有if语句……很好的捕获…@user738974 np!