Laravel如何通过表单选择的id插入对应关联字段price的值
问题核心说明
你当前的表单仅提交了商品ID master_item_id,没有附带价格字段的提交,所以控制器直接读取 $request->price 无法获取到对应数据。你猜测的用find()/where()查询商品价格的思路是正确的,且该方案安全性更高,具体实现如下:
方案1:后端查询商品价格(推荐)
该方案直接从数据库查询商品的标准价格,避免前端恶意篡改价格导致数据异常,适合绝大多数业务场景。
- 首先在控制器中先校验提交参数的合法性,再根据商品ID查询对应价格,最后写入数据库,控制器代码修改如下:
// 校验提交参数 $validated = $request->validate([ 'master_item_id' => 'required|exists:master_items,id', 'quantity_item' => 'required|integer|min:1' ]); // 根据商品ID查询商品信息,此处假设你的商品模型为 MasterItem,可根据实际类名调整 $item = \App\Models\MasterItem::find($validated['master_item_id']); // 也可以用where方法实现,效果完全一致 // $item = \App\Models\MasterItem::where('id', $validated['master_item_id'])->first(); // 创建Buy记录 Buy::create([ 'master_item_id' => $validated['master_item_id'], 'quantity_item' => $validated['quantity_item'], 'price' => $item->price ]);
方案2:前端动态传递价格(不推荐,存在安全风险)
如果你的场景不需要严格管控价格安全性,也可以在前端通过JS动态把选中商品的价格放入隐藏表单字段提交,实现如下:
- 视图代码修改,给option加自定义价格属性,新增隐藏的price字段,同时修正原有old值回显的错误逻辑:
<select id="master_item_id" name="master_item_id" class="form-control @error('master_item_id') is-invalid @enderror"> <option></option> @foreach($item as $value) <option {{ old('master_item_id') == $value->id ? 'selected' : '' }} value="{{ $value->id }}" data-price="{{ $value->price }}" > {{ $value->name_item }} | Rp {{ number_format($value->price, 0, ',', '.')}} </option> @endforeach </select> <!-- 新增隐藏的价格提交字段 --> <input type="hidden" name="price" id="price" value="{{ old('price') }}">
- 新增JS逻辑,监听select选择变化,动态给隐藏字段赋值:
document.getElementById('master_item_id').addEventListener('change', function() { const selectedOpt = this.options[this.selectedIndex]; document.getElementById('price').value = selectedOpt.dataset.price || ''; });
- 控制器无需修改,可直接读取
$request->price写入数据库。
注意:该方案价格完全由前端传递,恶意用户可通过浏览器调试工具修改价格后提交,生产环境不建议使用。
额外提示
你原有视图中的old值回显逻辑存在错误:原写法只要存在旧提交数据,所有option都会被加selected属性,实际应该判断旧值等于当前循环的商品ID时才标记选中,上述代码已经修正了该问题。
内容的提问来源于stack exchange,提问作者SomeRandomCode
相关产品推荐
相关产品推荐

