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

Laravel编辑数据时出现Undefined variable: id错误是什么原因?

问题修复及原理说明

核心报错原因

你触发的Undefined variable: id错误,完全是视图语法误用导致的:
在edit.blade.php的表单action定义中,你写的是$post->$id,这里多写了一个$符号:

  • 正常访问Eloquent模型的id属性,写法是$post->id,此处id是模型的固定属性名,不需要加$
  • 写成$post->$id属于PHP的「可变属性」用法:PHP会先尝试读取$id这个变量的值,再把该值作为属性名去访问$post的对应属性,而你从控制器传给视图的只有$post变量,没有单独传递$id变量,自然会报变量未定义的错误。

其他隐藏问题

1. 表单请求方法错误

HTML原生表单仅支持GET、POST两种请求方式,就算你写method="PUT"也不会生效,Laravel的resource路由中update方法默认匹配PUT请求,需要手动添加伪方法指令声明请求类型。

2. 控制器update方法调用错误

你写的$post::update($request->validated());是静态调用,会直接触发Post模型的静态更新方法,没有指定更新条件的前提下甚至会更新全表数据,你已经通过findOrFail拿到了单条记录的实例,应该调用实例的更新方法。

3. 表单回填值写错

url_clean输入框的旧值回填你写的是old('content', $post->url_clean),第一个参数应该对应字段名url_clean,否则提交后校验失败时该字段无法正常回填旧值。

完整修复方案

第一步:修改edit.blade.php

@extends('dashboard.master')

@section('content')

    @include('dashboard.partials.validation-error')

    {{-- 修复action语法、请求方法,添加@method指令 --}}
    <form action="{{ route("post.update", $post->id) }}" method="POST">
        @csrf
        @method('PUT')

        <div class="form-group">
            <label for="title">Título</label>
            <input class="form-control" type="text" name="title" id="title" value="{{ old('title', $post->title) }}">

            @error('title')
                <small class="text-danger">
                    {{ $message }}
                </small>
            @enderror
        </div>

        <div class="form-group">
            <label for="url_clean">Url limpia</label>
            {{-- 修复old的字段名参数 --}}
            <input class="form-control" type="text" name="url_clean" id="url_clean" value="{{ old('url_clean', $post->url_clean) }}">
        </div>

        <div class="form-group">
            <label for="content">Contenido</label>
            <textarea class="form-control" type="text" name="content" id="content" rows="3"> {{ old('content', $post->content) }} </textarea>
        </div>

        <input type="submit" class="btn btn-primary" value="Enviar"> 
    </form>

@endsection

第二步:修改PostController的update方法

public function update(Request $request, $id)
{
    $post = Post::findOrFail($id);
    // 把静态调用::改成实例调用->
    $post->update($request->validated());
    return back()->with('status', '¡Post editado con éxito!');
}

关于自定义主键的说明

你选择不用路由模型绑定的入门写法完全合理,就算后续你把Post模型的主键改成非id的字段(比如post_id),只需要把$post->id改成对应属性名$post->post_id即可,和当前写法完全兼容。

内容的提问来源于stack exchange,提问作者El conde Lucanor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:57:00