You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade@if判断提示Undefined variable $category错误

错误产生原因
  • 直接触发报错的原因:控制器create方法中虽然定义了$category变量,但调用view()渲染模板时,没有将该变量注入到模板中,Blade引擎无法访问未传递的变量,因此抛出「Undefined variable $category」错误。
  • 额外的逻辑错误:就算修正传参问题,现有代码逻辑也不符合业务需求:Product::select('category')->get()返回的是数据库中所有已有商品的分类字段集合(是包含多条记录的Eloquent集合对象,不是单个字符串值),直接和'liquor'做等值判断永远无法得到预期结果。且create方法对应商品新增表单页,此时还没有生成商品数据,查询已有商品的分类完全不匹配「根据用户当前选择的分类显示对应表单项」的需求。
修复方案

1. 修正控制器代码

新增商品页面不需要提前查询已有商品的分类数据,移除多余的查询逻辑,直接渲染模板即可:

public function create()
{
    return view('products.create');
}

如果是后续做编辑商品功能,需要在控制器中把当前编辑的商品实例传递给模板,例如:

public function edit($id)
{
    $product = Product::findOrFail($id);
    return view('products.edit', compact('product'));
}

2. 修正模板逻辑

你需要的是「用户选择分类为liquor时,实时显示酒类专属表单项」,这个交互属于前端动态响应范畴,不需要后端PHP做页面加载时的判断(后端判断只能在页面刷新时生效,无法响应用户在页面上的实时选择操作)。
调整模板代码,给酒类专属表单项加外层包裹容器,通过JS监听分类下拉框的选择事件,动态控制区块显示/隐藏:

<div class="row mb-4">
    <label for="category" class="col-md-4 col-form-label text-md-end">Category</label>
    <div class="col-md-6">
        <select name="category" id="category" class="form-select col-md-6">
            <option value="liquor">liquor</option>
            <option value="food">food</option>
            <option value="DIY">DIY</option>
            <option value="thrift shops">thrift shops</option>
            <option value="home decor">home decor</option>
            <option value="phones and tablets">phones and tablets</option>
            <option value="computing">computing</option>
            <option value="electronics">electronics</option>
            <option value="beauty products">beauty products</option>
            <option value="others">others</option>
        </select>
    </div>
</div>

{{-- 酒类专属字段外层容器,默认隐藏 --}}
<div id="liquor-fields" style="display: none;">
    <div class="row mb-4">
        <label for="subcategory" class="col-md-4 col-form-label text-md-end">Sub Category</label>
        <div class="col-md-6">
            <select name="subcategory" id="subcategory" class="form-select col-md-6">
                <option value="null">Select subcategory</option>
                <option value="wine">Wine</option>
                <option value="whisky">Whisky</option>
                <option value="brandy">Brandy</option>
                <option value="scotch">Scotch</option>
                <option value="spirit">Spirit</option>
                <option value="gin">Gin</option>
                <option value="vodka">Vodka</option>
                <option value="beer">Beer</option>
                <option value="rum">Rum</option>
                <option value="mixers">Mixers</option>
                <option value="bourbon">Bourbon</option>
                <option value="cognac">Cognac</option>
                <option value="other">Other</option>
            </select>
        </div>
    </div>      
    
    <div class="row mb-4">
        <label for="volume" class="col-md-4 col-form-label text-md-end">Volume</label>
        <div class="col-md-6">
            <select name="volume" id="volume" class="form-select col-md-6">
                <option value="null">Choose volume</option>
                <option value="5ltr">5ltr</option>
                <option value="1ltr">1ltr</option>
                <option value="750ml">750ml</option>
                <option value="500ml">500ml</option>
                <option value="250ml">250ml</option>
                <option value="other">Other</option>
            </select>
        </div>
    </div>
</div>

<script>
const categorySelect = document.getElementById('category');
const liquorFields = document.getElementById('liquor-fields');

function toggleLiquorFields() {
    liquorFields.style.display = categorySelect.value === 'liquor' ? 'block' : 'none';
}
// 页面初始加载时执行一次判断
toggleLiquorFields();
// 监听下拉框选择变化
categorySelect.addEventListener('change', toggleLiquorFields);
</script>

如果是编辑商品场景,只需要修改外层容器的默认显示样式,根据后端传入的商品分类判断初始状态即可:

<div id="liquor-fields" style="display: {{ isset($product) && $product->category == 'liquor' ? 'block' : 'none' }};">

内容的提问来源于stack exchange,提问作者Felicity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:12:25