在Laravel中如何实现两个SQL字段相减并将结果存入km_travel字段
解决方案
方法1:直接在控制器内计算(逻辑直观,适合新手)
直接在save()方法执行前添加差值计算的赋值逻辑即可,修改后的完整代码如下:
public function store(Request $request) { // 先做请求校验,避免非法数据入库 $validated = $request->validate([ 'start_odo' => 'required|numeric|min:0', 'end_odo' => 'required|numeric|gte:start_odo', ]); $count= new VehicleLog(); $count->start_odo = $validated['start_odo']; $count->end_odo = $validated['end_odo']; // 新增行驶里程计算逻辑 $count->km_travel = $validated['end_odo'] - $validated['start_odo']; $count->save(); return redirect('/resulttravel')->with('success', 'data added'); }
方法2:模型自动计算(适合长期维护,避免重复写逻辑)
如果后续多个业务场景都会新增/修改VehicleLog数据,可以把计算逻辑放到模型的saving钩子中,每次保存数据时自动填充km_travel字段:
- 打开
app/Models/VehicleLog.php文件,添加如下代码:
protected static function booted() { static::saving(function ($vehicleLog) { $vehicleLog->km_travel = $vehicleLog->end_odo - $vehicleLog->start_odo; }); }
- 配置完成后控制器不需要额外写km_travel的赋值逻辑,原有代码保存时会自动计算填充对应字段。
注意事项
- 确保数据库中
km_travel字段的类型为数值类型(int/float/double等),不要使用字符串类型 - 校验规则中的
gte:start_odo会自动校验结束里程大于等于起始里程,避免出现负数的行驶里程
内容的提问来源于stack exchange,提问作者sifakale
相关产品推荐
相关产品推荐

