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

如何在Laravel项目中创建并展示自动计算的折扣金额字段

实现折扣金额自动计算的修改步骤

第一步:修正控制器逻辑错误

你当前的控制器代码存在变量未定义的问题,$sale_price和$discount_percentage没有声明,同时缺失了迁移文件中要求的必填字段赋值,调整后代码如下:

public function store(Request $request){
    $presupuestoProducto = new PresupuestoProducto();

    $presupuestoProducto->presupuesto_id = $request->presupuesto_id;
    // 补充迁移要求的必填字段赋值,避免数据库写入报错
    $presupuestoProducto->product_id = $request->product_id;
    $presupuestoProducto->quantity = $request->quantity;
    $presupuestoProducto->sale_coin = $request->sale_coin;
    $presupuestoProducto->AlicuotaIVA = $request->AlicuotaIVA;
    $presupuestoProducto->commentary = $request->commentary ?? '';

    $presupuestoProducto->sale_price = $request->sale_price;
    $presupuestoProducto->discount_percentage = $request->discount_percentage;
    // 修正变量引用,从请求中取对应值计算
    $presupuestoProducto->discount = ($request->sale_price * $request->discount_percentage) / 100;

    $presupuestoProducto->save();
    // 将计算好的折扣金额闪存到session,返回视图时可直接读取
    Session::flash('discount', $presupuestoProducto->discount);
    Session::flash('success');
    return redirect()->route('presupuestos-productos.view');
}

第二步:修改视图代码

根据你的使用场景二选一即可:

场景1:表单提交后展示后端计算结果

将原discount输入框改为只读属性,直接读取session返回的计算值:

<div class="form-group col-md-2">
    <label for="sale_price">Precio de Venta</label>
    <input type="number"  pattern="[0-9]+([\.,][0-9]+)?" step="0.01" name="sale_price" class="form-control">
</div>
<div class="form-group col-md-3">
    <label for="discount_percentage">Porcentaje de descuento (%)</label>
    <input type="number" name="discount_percentage" class="form-control">
</div>
<div class="form-group col-md-3">
    <label for="discount">Descuento</label>
    <!-- 只读属性禁止用户输入,提交后自动显示后端计算结果 -->
    <input type="number" name="discount" class="form-control" value="{{ Session::get('discount', 0) }}" readonly>
</div>

场景2:用户输入时实时展示计算结果

无需触发后端请求,新增一段前端JS即可实现实时计算,后端仍需保留计算逻辑作为数据校验,避免前端篡改数据:

<!-- 原有表单部分,补充输入框id属性用于JS绑定 -->
<div class="form-group col-md-2">
    <label for="sale_price">Precio de Venta</label>
    <input type="number" id="sale_price" pattern="[0-9]+([\.,][0-9]+)?" step="0.01" name="sale_price" class="form-control">
</div>
<div class="form-group col-md-3">
    <label for="discount_percentage">Porcentaje de descuento (%)</label>
    <input type="number" id="discount_percentage" name="discount_percentage" class="form-control">
</div>
<div class="form-group col-md-3">
    <label for="discount">Descuento</label>
    <input type="number" id="discount" name="discount" class="form-control" readonly>
</div>

<!-- 新增实时计算JS代码 -->
<script>
const salePriceInput = document.getElementById('sale_price');
const discountPercentInput = document.getElementById('discount_percentage');
const discountInput = document.getElementById('discount');

function calcDiscount() {
    const salePrice = parseFloat(salePriceInput.value) || 0;
    const discountPercent = parseInt(discountPercentInput.value) || 0;
    discountInput.value = (salePrice * discountPercent / 100).toFixed(2);
}

// 监听输入框变化自动计算
salePriceInput.addEventListener('input', calcDiscount);
discountPercentInput.addEventListener('input', calcDiscount);
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:09:03