Php Blade foreach循环在为空时抛出错误
我不明白这为什么不起作用 在Laravel中,Post和Tag的两个模型之间存在多对多关系 显示帖子时,我的刀片模板中有以下代码: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
@if(!empty($page->tags))
@foreach($page->tags as $tag)
@if($loop->last)
{{$tag->name}}
@else
{{$tag->name}},
@endif
@foreach
@endif
但是,如果帖子上没有标签,则会抛出以下错误:
未定义的偏移量:1Illumb\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!