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

Laravel如何根据操作类型设置金额字段的正负符号?

解决Laravel表单金额正负值存储问题

问题分析

当前核心问题有两点:

  1. 视图下拉框的option值设置错误,传递给控制器的不是预期的0/1/2数值,而是字符串(如cheltuiala),导致后续判断逻辑失效
  2. 控制器未根据操作类型对金额字段做正负处理

修复步骤

1. 修正视图下拉框选项值

将option的value属性改为对应数字值,确保控制器能拿到正确的操作类型标识:

<div class="mb-3">
<label class="form-label">Tip actiune(0 = cheltuiala, 1 = plata, 2 = incasare)</label>
<select class="form-select" aria-label="Default select example" name='Status_Tranzactii'>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
</select>
</div>

2. 控制器添加金额正负处理逻辑

给$istoric->suma赋值时,根据操作类型判断是否添加负号:

public function saveProjDet(Request $request, IstoricProiecte $istoric, Colaboratori $colaborator)
{
    $istoric->proiecte_id = $request->input('id_proiect');
    $istoric->action_type = $request->Status_Tranzactii;
    $istoric->colaboratori_id = $request->Colab_id;
    
    // 根据操作类型处理金额正负
    $suma = $request->input('suma');
    $actionType = $request->Status_Tranzactii;
    if ($actionType == 0 || $actionType == 1) {
        $istoric->suma = -abs($suma); // 转为负数,abs确保输入负数也统一为负
    } else {
        $istoric->suma = abs($suma); // 转为正数,避免输入负数导致错误
    }
    
    $istoric->data = $request->data;
    $istoric->save();
    return back();
}

额外优化建议

  • 添加请求验证,确保参数有效性:
$request->validate([
    'Status_Tranzactii' => 'required|in:0,1,2',
    'suma' => 'required|numeric',
]);
  • 用模型修改器封装逻辑(推荐):在IstoricProiecte模型中添加修改器,控制器无需重复写判断:
public function setSumaAttribute($value)
{
    if ($this->action_type == 0 || $this->action_type == 1) {
        $this->attributes['suma'] = -abs($value);
    } else {
        $this->attributes['suma'] = abs($value);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:45:24