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>
问题排查与修复
核心问题
- 字段名不匹配:select标签的
name属性为supplier,但Product模型的可填充字段是supplier_id,表单提交后控制器无法获取正确的关联ID。 - 无效隐藏输入框:页面顶部的隐藏input使用了不存在的
$supplier变量,导致supplier_id提交空值,干扰正常字段赋值。 - select属性错误:select标签本身不支持
value属性设置选中状态,需通过option的selected属性实现。
修复步骤
移除无用隐藏input:删除以下代码,避免空值干扰:
<input type="hidden" class="form-control" name="supplier_id" value="{{$supplier->id}}">修正select的name属性:将select的
name改为supplier_id,与模型字段对应:<select name="supplier_id" id="suppliers">添加选中状态逻辑:在option标签中加入
selected属性,保留表单提交后的选中状态:@foreach($suppliers as $supplier) <option value="{{$supplier->id}}" {{ old('supplier_id') == $supplier->id ? 'selected' : '' }}>{{$supplier->name}}</option> @endforeach检查控制器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
相关产品推荐
相关产品推荐

