Laravel9执行save/update时报错Attempt to assign property "name" on null求助
Laravel 9 更新数据触发「Attempt to assign property "name" on null」错误解决
问题概述
Laravel 9基础学习阶段,使用save()或update()操作数据库更新name、email、address、phone字段时,触发错误:Attempt to assign property "name" on null。
相关代码
Blade视图代码
<div class="container mt-5 mb-5 w-25" > <div class="card"> <div class="card-header"> <p class="fs-1">Update Members</p> </div> <div class="card-body"> <form class="row g-3" action="/update" method="POST"> @csrf <div class="col-12"> <label for="id" class="form-label">Id</label> <input type="hidden" value="{{$data['id']}}" class="form-control " id="id"> </div> <div class="col-12"> <label for="name" class="form-label">Name</label> <input type="text" class="form-control" value="{{$data['Name']}}" id="name"> </div> <div class="col-12"> <label for="email" class="form-label">Email</label> <input type="text" class="form-control" value="{{$data['Email']}}" id="email"> </div> <div class="col-12"> <label for="address" class="form-label">Address</label> <input type="text" class="form-control" value="{{$data['Address']}}" id="address"> </div> <div class="col-12"> <label for="phone" class="form-label">Phone</label> <input type="text" class="form-control" value="{{$data['Phone']}}" id="phone"> </div> <div class="col-12"> <button type="submit" class="btn btn-primary">Update</button> <hr class="border border-primary border-3 opacity-75"> </div> </form> </div> </div> </div>
数据库列结构
数据库表包含id、Name、Email、Address、Phone字段(注意大小写)。
错误原因
- 表单字段缺失
name属性:Blade视图中所有输入框仅设置了id,未添加name属性,导致表单提交后后端无法获取id、name、email等字段值。 - 模型实例查询返回null:控制器中若基于未获取到的id查询模型,会返回null,后续直接给null对象赋值属性就会触发
Attempt to assign property "name" on null错误。 - (可能)模型未配置可批量赋值字段:若使用
update()方法批量更新,模型未设置$fillable会导致字段无法写入。
解决方案
1. 修复Blade表单的name属性
给所有需要提交的输入框添加name属性,确保后端能接收数据:
<div class="col-12"> <label for="id" class="form-label">Id</label> <input type="hidden" name="id" value="{{$data['id']}}" class="form-control" id="id"> </div> <div class="col-12"> <label for="name" class="form-label">Name</label> <input type="text" name="name" class="form-control" value="{{$data['Name']}}" id="name"> </div> <div class="col-12"> <label for="email" class="form-label">Email</label> <input type="text" name="email" class="form-control" value="{{$data['Email']}}" id="email"> </div> <div class="col-12"> <label for="address" class="form-label">Address</label> <input type="text" name="address" class="form-control" value="{{$data['Address']}}" id="address"> </div> <div class="col-12"> <label for="phone" class="form-label">Phone</label> <input type="text" name="phone" class="form-control" value="{{$data['Phone']}}" id="phone"> </div>
2. 控制器添加查询校验并正确更新
在控制器的更新方法中,先校验查询到的模型实例是否存在,再执行更新:
public function update(Request $request) { // 根据提交的id查询模型 $member = \App\Models\Member::find($request->input('id')); // 校验实例是否存在 if (!$member) { return redirect()->back()->with('error', '要更新的记录不存在'); } // 方式1:逐个赋值后save() $member->name = $request->input('name'); $member->email = $request->input('email'); $member->address = $request->input('address'); $member->phone = $request->input('phone'); $member->save(); // 方式2:使用update()批量更新(需模型配置$fillable) // $member->update($request->only(['name', 'email', 'address', 'phone'])); return redirect()->back()->with('success', '记录更新成功'); }
3. 配置模型可批量赋值字段
若使用update()批量更新,需在Member模型中设置$fillable属性,允许字段写入:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Member extends Model { // 允许批量赋值的字段 protected $fillable = ['name', 'email', 'address', 'phone']; }
4. 确认路由配置正确
确保更新路由为POST请求,指向正确的控制器方法:
use App\Http\Controllers\MemberController; Route::post('/update', [MemberController::class, 'update']);
内容的提问来源于stack exchange,提问作者abdifatah
相关产品推荐
相关产品推荐

