Laravel中CRUD应用update函数无法生效,请求排查代码问题
Laravel CRUD更新数据不生效的问题排查与修复
问题根源分析
你的代码存在3个关键问题导致更新操作无效:
- 变量名大小写不匹配:PHP是大小写敏感语言,验证后得到的变量是
$validatedata,但执行更新时调用的是$validateData,后者未定义,导致传入空数据执行更新。 - 请求字段与数据库字段不对应:迁移文件中性别字段名为
jk,但验证规则和请求参数用的是jenis_kelamin,字段名不匹配导致该字段无法写入,且其他字段也因变量错误未被正确传递。 - 模型类名不符合Laravel规范:模型类名使用全小写的
mahasiswa,Laravel约定模型类名首字母大写(应为Mahasiswa),可能导致路由模型绑定或ORM操作出现隐性问题。
修正后的代码
控制器(Controller)
public function update(Request $request, Mahasiswa $mahasiswa) { $validatedData = $request->validate([ 'nim' => 'required|size:8|unique:mahasiswas,nim,'.$mahasiswa->id, 'nama' => 'required|min:3|max:50', // 统一字段名小写,与数据库一致 'jenis_kelamin' => 'required|in:P,L', 'jurusan' => 'required', 'alamat' => '', ]); // 将请求字段jenis_kelamin映射为数据库字段jk $validatedData['jk'] = $validatedData['jenis_kelamin']; unset($validatedData['jenis_kelamin']); // 利用路由模型绑定的实例直接更新,无需再次查询数据库 $mahasiswa->update($validatedData); return redirect()->route('mahasiswas.show', ['mahasiswa' => $mahasiswa->id]) ->with('pesan', "Update data {$validatedData['nama']} berhasil"); }
模型(Model)
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; // 修正类名为首字母大写的Mahasiswa,符合Laravel规范 class Mahasiswa extends Model { use HasFactory; protected $guarded = []; }
迁移文件(Migration)
无需修改,保持原代码即可:
public function up() { Schema::create('mahasiswas', function (Blueprint $table) { $table->id(); $table->char('nim', 8)->unique(); $table->string('nama'); $table->char('jk',1); $table->string('jurusan'); $table->text('alamat')->nullable(); $table->timestamps(); }); }
额外说明
- 建议表单提交的字段名尽量与数据库字段名保持一致,避免额外的字段映射操作,减少出错概率。
- 使用路由模型绑定后,直接调用模型实例的
update()方法更高效,无需通过where查询再更新。
内容的提问来源于stack exchange,提问作者Muhammad Gunawan
相关产品推荐
相关产品推荐

