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

Laravel创建Product时supplier_id为NULL问题求助

问题:创建Product时supplier_id字段始终为NULL

我已在Supplier与Product之间建立一对多关联,模型代码如下:

Model Product

class Product extends Model
{
    use HasFactory;
    protected $fillable = [
        'description',
        'barcode',
        'quantity',
        'price',
        'supplier_id'
    ];

    public function supplier()
    {
        return $this->belongsTo(Supplier::class);
    }
}

Model Supplier

class Supplier extends Model
{
    use HasFactory;
    protected $fillable = [
        'name',
    ];

    public function products()
    {
        return $this->hasMany(Product::class);
    }
}

创建Product时,通过select下拉框加载所有供应商并选择目标供应商,但创建成功后,Product的supplier_id字段始终为NULL,怀疑是select设置问题,附上创建视图代码:

View create

<x-layout>
    <div class="container mt-5 mb-5">

        <form action="{{route('product.store')}}" method="post">
            @csrf
            <div class="row mt-3">
                <div class="mb-3 col-12 col-md-5">

                    <input type="hidden" class="form-control" name="supplier_id" value="{{$supplier->id}}">
                    
                    <div>
                        <label for="suppliers" class="form-label">Supplier</label>
                        <select name="supplier" id="suppliers" value="{{ $product->supplier_id }}">
                            @foreach($suppliers as $supplier)
                            <option value="{{$supplier->id}}">{{$supplier->name}}</option>
                            @endforeach
                        </select>
                    </div>

                    <label for="description" class="form-label">Description</label>
                    <textarea name="description" cols="30" rows="10" class="form-control p-3" required>{{ old('description') }}</textarea>

                    <label for="barcode" class="form-label">BarCode</label>
                    <input type="number" class="form-control p-3" name="barcode" value="{{ old('barcode') }}" required>


                    <label for="quantity" class="form-label">Quantity</label>
                    <input type="number" class="form-control p-3" name="quantity" value="{{ old('quantity') }}" required>
            
                    <label for="price" class="form-label">Price</label>
                    <input type="number" step="any" class="form-control p-3" name="price" value="{{ old('price') }}">

                </div>
            </div>

            <button type="submit" class="btn btn-primary mb-5 py-3 px-4 mt-3 ms-3 fs-5">ADD</button>

        </form>
    </div>

</x-layout>

问题排查与修复

核心问题

  1. 字段名不匹配:select标签的name属性为supplier,但Product模型的可填充字段是supplier_id,表单提交后控制器无法获取正确的关联ID。
  2. 无效隐藏输入框:页面顶部的隐藏input使用了不存在的$supplier变量,导致supplier_id提交空值,干扰正常字段赋值。
  3. select属性错误:select标签本身不支持value属性设置选中状态,需通过option的selected属性实现。

修复步骤

  1. 移除无用隐藏input:删除以下代码,避免空值干扰:

    <input type="hidden" class="form-control" name="supplier_id" value="{{$supplier->id}}">
    
  2. 修正select的name属性:将select的name改为supplier_id,与模型字段对应:

    <select name="supplier_id" id="suppliers">
    
  3. 添加选中状态逻辑:在option标签中加入selected属性,保留表单提交后的选中状态:

    @foreach($suppliers as $supplier)
        <option value="{{$supplier->id}}" {{ old('supplier_id') == $supplier->id ? 'selected' : '' }}>{{$supplier->name}}</option>
    @endforeach
    
  4. 检查控制器store方法:确保正确验证并接收supplier_id,示例代码:

    public function store(Request $request)
    {
        $validated = $request->validate([
            'supplier_id' => 'required|exists:suppliers,id',
            'description' => 'required',
            'barcode' => 'required|unique:products',
            'quantity' => 'required|integer|min:0',
            'price' => 'nullable|numeric|min:0',
        ]);
    
        Product::create($validated);
    
        return redirect()->route('products.index')->with('success', 'Product created successfully.');
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:01:34