Laravel 10使用资源控制器无法更新数据表数据问题
Laravel 10资源控制器更新数据无变化排查与解决
核心问题:表单输入框缺失name属性
你的表单中,输入框仅设置了id属性,但没有添加name属性——Laravel的Request对象是通过表单字段的name来获取提交值的,这导致控制器无法接收到表单数据,自然不会更新数据库;而你没看到错误提示,是因为表单没有添加验证错误展示逻辑。
修正表单代码
给所有需要提交的输入框添加name属性,并增加错误提示模块,示例如下:
<form method="post" class="mx-2 p-4" action="{{ route('accounting_group.update', $accounting_group->id) }}"> @csrf @method('put') <!-- 验证错误提示 --> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <div class="form-group"> <label for="id">ID Akun</label> <!-- 添加name="id" --> <input type="text" class="form-control" id="id" name="id" placeholder="ID accounting..." value="{{ old('id', $accounting_group->id) }}"> </div> <div class="form-group"> <label for="name">Nama Kelompok Akun</label> <!-- 添加name="name" --> <input type="text" class="form-control" id="name" name="name" placeholder="Nama kelompok..." value="{{ old('name', $accounting_group->name) }}"> </div> <div class="form-group"> <label for="description">Deskripsi</label> <!-- 添加name="description" --> <textarea class="form-control" id="description" name="description" placeholder="Deskripsi kelompok...">{{ old('description', $accounting_group->description) }}</textarea> </div> <div class="d-flex justify-content-end"> <button type="submit" class="btn btn-primary">Simpan</button> </div> </form>
额外优化建议:避免修改主键ID
通常数据库主键(id)不应允许修改,这会破坏关联数据的完整性(比如你的TransactionAccount表关联了accounting_group_id)。如果不需要修改ID,建议做以下调整:
1. 控制器移除ID验证规则
public function update(Request $request, string $id):RedirectResponse { // 移除id的验证规则 $input = $request->validate([ 'name'=>'required', 'description'=>'required', ]); $accounting_group = AccountingGroup::findOrFail($id); $accounting_group->update($input); return redirect()->route('accounting_group.index')->with(['success' => 'Data telah disimpan']); }
2. 模型移除ID的可填充属性
class AccountingGroup extends Model { use HasFactory; protected $table = 'accounting_groups'; // 移除id protected $fillable = [ 'name', 'description', ]; protected $hidden = []; public function transactionaccount(): HasMany { return $this->hasMany(TransactionAccount::class); } }
3. 表单设置ID字段为只读或隐藏
<!-- 只读显示ID,不允许修改 --> <div class="form-group"> <label for="id">ID Akun</label> <input type="text" class="form-control" id="id" value="{{ $accounting_group->id }}" readonly> </div> <!-- 或者直接隐藏字段(路由已传入id,可完全去掉该字段) --> <input type="hidden" name="id" value="{{ $accounting_group->id }}">
调试技巧:日志排查
如果问题仍未解决,可在控制器中添加日志,追踪数据流转:
public function update(Request $request, string $id):RedirectResponse { \Log::info('提交的表单数据:', $request->all()); $input = $request->validate([ 'name'=>'required', 'description'=>'required', ]); \Log::info('验证后的输入数据:', $input); $accounting_group = AccountingGroup::findOrFail($id); \Log::info('更新前的模型数据:', $accounting_group->toArray()); $accounting_group->update($input); // 从数据库重新获取数据,确认更新结果 \Log::info('更新后的模型数据:', $accounting_group->fresh()->toArray()); return redirect()->route('accounting_group.index')->with(['success' => 'Data telah disimpan']); }
查看storage/logs/laravel.log文件,即可清晰看到每一步的数据是否符合预期。
内容的提问来源于stack exchange,提问作者Ahmad Zidni Zainul Ikhsan
相关产品推荐
相关产品推荐

