Laravel如何根据操作类型设置金额字段的正负符号?
解决Laravel表单金额正负值存储问题
问题分析
当前核心问题有两点:
- 视图下拉框的
option值设置错误,传递给控制器的不是预期的0/1/2数值,而是字符串(如cheltuiala),导致后续判断逻辑失效 - 控制器未根据操作类型对金额字段做正负处理
修复步骤
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
相关产品推荐
相关产品推荐

