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

Laravel8行程表单提交后更新车辆里程的实现疑问

里程追踪应用重构解决方案

问题核心

基于Laravel8重构里程追踪应用,需实现两个核心功能:

  • 司机选择车牌后,自动加载车辆当前里程,仅需输入行程结束里程
  • 提交表单时,将当前里程、结束里程存入travels表,同时更新cars表(对应Viaturas模型)的车辆当前里程

现有代码问题分析

  1. 下拉选择框逻辑错误:当前select的value绑定的是车辆里程,无法通过车牌定位车辆;且name="quilometragem"会导致提交时里程覆盖车牌信息
  2. 控制器create方法冗余:Viaturas $matricula参数未正确使用,Viaturas::find($matricula)写法错误
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:05:48