Laravel实现st_in/st_out字段二选一互斥必填校验
Laravel库存出入库记录接口校验实现
业务规则
库存交易提交需满足以下校验要求:
- 入库字段(参数名
st_in)和出库字段(参数名st_out)禁止同时填写 - 入库、出库字段禁止同时为空
- 仅当两个字段恰好填写其中一项时,才允许写入交易数据
原有代码问题
当前控制器方法未加任何参数校验,无论参数是否合规都会直接执行数据库写入,不符合业务要求,原有代码如下:
public function stock_record(Request $request){ $stock=new Transection; $stock->in=$request->st_in; $stock->out=$request->st_out; $stock->product_id=$request->st_name; $stock->barcode=$request->barcode; $stock->description=$request->st_description; $stock->user_id=Auth::id(); $stock->save(); return redirect('dashboard')->with('message',"Transection successfully updated"); }
修正后代码
直接在写入前加Laravel原生校验+互斥判断即可,校验失败会自动回退到表单页并携带错误信息,和现有页面交互逻辑适配:
public function stock_record(Request $request){ // 基础规则校验 $request->validate([ 'st_in' => 'nullable|numeric|required_without:st_out', 'st_out' => 'nullable|numeric|required_without:st_in', 'st_name' => 'required', 'barcode' => 'required', 'st_description' => 'nullable|string' ], [ 'st_in.required_without' => '入库、出库数量不能同时为空', 'st_out.required_without' => '入库、出库数量不能同时为空' ]); // 拦截同时填写出入库的非法请求 if ($request->filled('st_in') && $request->filled('st_out')) { return back() ->withErrors(['st_in' => '同一笔记录不能同时填写入库和出库数量']) ->withInput(); } // 校验通过才执行数据保存 $stock = new Transection; $stock->in = $request->st_in; $stock->out = $request->st_out; $stock->product_id = $request->st_name; $stock->barcode = $request->barcode; $stock->description = $request->st_description; $stock->user_id = Auth::id(); $stock->save(); return redirect('dashboard')->with('message', '交易记录提交成功'); }
逻辑说明
required_without是Laravel内置验证规则,当对应字段为空时当前字段必填,刚好覆盖「两个字段都为空」的校验场景- 额外加的互斥判断专门拦截「两个字段同时填写」的场景
- 校验失败时框架自动闪存错误信息,前端Blade模板直接读取
$errors变量即可渲染错误提示,不需要额外写跳转传参逻辑 - 给
st_in、st_out加了numeric规则,避免传入非数字的非法数量值
内容的提问来源于stack exchange,提问作者Md Mredul Sarker
相关产品推荐
相关产品推荐

