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

Laravel如何通过表单选择的id插入对应关联字段price的值

问题核心说明

你当前的表单仅提交了商品ID master_item_id,没有附带价格字段的提交,所以控制器直接读取 $request->price 无法获取到对应数据。你猜测的用find()/where()查询商品价格的思路是正确的,且该方案安全性更高,具体实现如下:

方案1:后端查询商品价格(推荐)

该方案直接从数据库查询商品的标准价格,避免前端恶意篡改价格导致数据异常,适合绝大多数业务场景。

  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动态把选中商品的价格放入隐藏表单字段提交,实现如下:

  1. 视图代码修改,给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') }}">
  1. 新增JS逻辑,监听select选择变化,动态给隐藏字段赋值:
document.getElementById('master_item_id').addEventListener('change', function() {
    const selectedOpt = this.options[this.selectedIndex];
    document.getElementById('price').value = selectedOpt.dataset.price || '';
});
  1. 控制器无需修改,可直接读取$request->price写入数据库。

注意:该方案价格完全由前端传递,恶意用户可通过浏览器调试工具修改价格后提交,生产环境不建议使用。

额外提示

你原有视图中的old值回显逻辑存在错误:原写法只要存在旧提交数据,所有option都会被加selected属性,实际应该判断旧值等于当前循环的商品ID时才标记选中,上述代码已经修正了该问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:18:00