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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:25:01