Laravel8行程表单提交后更新车辆里程的实现疑问
里程追踪应用重构解决方案
问题核心
基于Laravel8重构里程追踪应用,需实现两个核心功能:
- 司机选择车牌后,自动加载车辆当前里程,仅需输入行程结束里程
- 提交表单时,将当前里程、结束里程存入
travels表,同时更新cars表(对应Viaturas模型)的车辆当前里程
现有代码问题分析
- 下拉选择框逻辑错误:当前
select的value绑定的是车辆里程,无法通过车牌定位车辆;且name="quilometragem"会导致提交时里程覆盖车牌信息 - 控制器
create方法冗余:Viaturas $matricula参数未正确使用,Viaturas::find($matricula)写法错误 store方法缺失核心逻辑:未更新Viaturas表中的车辆当前里程,且模型命名与表名不匹配(Formulario应对应travels表)
分步解决方案
1. 重构Blade视图(create.blade.php)
修改下拉选择框绑定车牌,通过AJAX获取车辆当前里程并填充到表单,同时隐藏存储当前里程的字段:
<form action="{{ route('formulario.store') }}" method="POST"> @csrf <div> <label>选择车牌:</label> <select name="matricula" id="carSelect" required> <option value="">请选择车辆</option> @foreach($viaturas as $car) <option value="{{ $car->matricula }}">{{ $car->matricula }}</option> @endforeach </select> </div> <div> <label>当前里程:</label> <input type="number" name="current_km" id="currentKm" readonly required> </div> <div> <label>结束里程:</label> <input type="number" name="end_km" id="endKm" required> </div> <button type="submit">提交行程</button> </form> <script> document.getElementById('carSelect').addEventListener('change', function() { const matricula = this.value; if (!matricula) return; // 原生JS发送请求获取车辆当前里程 fetch(`/api/cars/${matricula}/km`) .then(response => response.json()) .then(data => { document.getElementById('currentKm').value = data.quilometragem; }) .catch(error => console.error('获取里程失败:', error)); }); </script>
2. 添加API路由(routes/api.php)
用于通过车牌获取车辆当前里程:
Route::get('/cars/{matricula}/km', [FormularioController::class, 'getCarKm']);
3. 重构控制器方法(FormularioController.php)
修正create方法
public function create() { $viaturas = Viaturas::all(); return view('admin.formulario.create', compact('viaturas')); }
添加getCarKm方法(处理AJAX请求)
public function getCarKm($matricula) { $car = Viaturas::where('matricula', $matricula)->firstOrFail(); return response()->json(['quilometragem' => $car->quilometragem]); }
完善store方法(保存行程+更新车辆里程)
public function store(Request $request) { $request->validate([ 'matricula' => 'required', 'current_km' => 'required|numeric', 'end_km' => 'required|numeric|gt:current_km', ]); // 保存行程记录到travels表(对应Formulario模型) $formulario = new Formulario(); $formulario->matricula = $request->matricula; $formulario->quilometragem = $request->current_km; // 对应行程开始里程 $formulario->perguntadois = $request->end_km; // 对应行程结束里程 $formulario->save(); // 更新车辆当前里程 $car = Viaturas::where('matricula', $request->matricula)->firstOrFail(); $car->quilometragem = $request->end_km; $car->save(); return redirect()->back()->with('status', '行程记录已成功添加'); }
4. 模型关联优化(可选)
为Viaturas模型添加行程关联,方便后续查询:
// app/Models/Viaturas.php public function travels() { return $this->hasMany(Formulario::class, 'matricula', 'matricula'); }
关键说明
- 确保
Viaturas模型的$fillable属性包含matricula和quilometragem字段,否则无法批量赋值 - 路由需正确配置
formulario.store的命名路由,可在routes/web.php中添加:Route::resource('formulario', FormularioController::class); - 若使用Laravel的CSRF保护,AJAX请求需携带CSRF令牌(原生JS可通过meta标签获取)
内容的提问来源于stack exchange,提问作者peterpan26
相关产品推荐
相关产品推荐

