【问题标题】:Blade foreach loop throws error when emptyBlade foreach 循环为空时抛出错误
【发布时间】:2020-11-02 10:44:17
【问题描述】:

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

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

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

@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
供应商/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) 它显示它只是一个空数组,所以我不明白为什么这不起作用。

【问题讨论】:

    标签: php laravel laravel-blade


    【解决方案1】:

    你没有关闭你的@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 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) {}

    【讨论】:

    • 我一定是做错了什么我只是不知道是什么。 @if($page->tags->isNotEmpty()) 和 @if(isset($page->tags)) 都不起作用,同样的错误。
    • @user738974 你能分享一下 if 里面的 {{ dd($page->tags) }},问题是在哪里引起的吗?
    • @user738974 哈哈哈。我们都错过了。正在更新答案。
    • 是的,刚刚发生了……我就是这样知道为时已晚……哈哈,谢谢你的帮助!就像这样它可以工作,甚至没有 if 语句......很好的捕捉......
    • @user738974 np!
    猜你喜欢
    • 2013-12-18
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2016-04-23
    • 2021-10-31
    相关资源
    最近更新 更多