Laravel Blade模板@if条件外部不生效,控制列显隐的正确写法是什么
问题根因
- 循环外的
$products是查询返回的模型集合,不是单个Product模型实例,集合本身不存在subcategory关联属性,因此表头的条件判断永远无法命中。
解决方案
根据你的业务场景选择对应写法即可:
场景1:列表内所有产品属于同一个子分类(常规筛选列表场景)
取集合第一个元素的关联属性判断,同时增加空集合校验:
@if($products->isNotEmpty() && $products->first()->subcategory->name == 'Image') <th>Demo</th> @endif
场景2:列表内存在不同子分类的产品,只要有一个属于Image分类就展示该列
用集合的contains方法做判断:
@if($products->contains(fn($item) => $item->subcategory->name == 'Image')) <th>Demo</th> @endif
优化方案
建议把判断逻辑提前放到控制器中计算,传入模板变量复用,避免模板层写复杂逻辑、同时避免重复计算:
- 控制器代码:
// 可根据你的业务场景替换成上面两个场景的判断逻辑 $showImageColumn = $products->isNotEmpty() && $products->first()->subcategory?->name == 'Image'; return view('你的模板路径', compact('products', 'showImageColumn'));
- 模板代码:
{{-- 表头判断 --}} @if($showImageColumn) <th>Demo</th> @endif {{-- 循环内判断 --}} @forelse ($products as $item) <tr> @if($showImageColumn) <td> <p>{{$item->surl}}</p> </td> @endif </tr> @endforelse
提示:如果
subcategory关联可能为空,使用空安全运算符?->或者optional()辅助函数可以避免非对象调用报错。
内容的提问来源于stack exchange,提问作者Tusher
相关产品推荐
相关产品推荐

