为了账号安全,请及时绑定邮箱和手机立即绑定

Blade foreach 循环在空时抛出错误

Blade foreach 循环在空时抛出错误

PHP
慕莱坞森 2023-07-30 13:19:11
我不明白为什么这不起作用。我在 Laravel 中的 Post 和 Tag 两个模型之间存在多对多关系。显示帖子时,我的刀片模板中有以下代码:@if(!empty($page->tags))    @foreach($page->tags as $tag)        @if($loop->last)            {{$tag->name}}        @else            {{$tag->name}},        @endif    @foreach@endif但是,当帖子上没有标签时,它会抛出此错误:未定义的偏移量:1Illuminate\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) 它显示它只是一个空数组,所以我不明白为什么这不起作用。
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


查看完整回答
反对 回复 2023-07-30
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信