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

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字段(注意大小写)。

错误原因

  1. 表单字段缺失name属性:Blade视图中所有输入框仅设置了id,未添加name属性,导致表单提交后后端无法获取id、name、email等字段值。
  2. 模型实例查询返回null:控制器中若基于未获取到的id查询模型,会返回null,后续直接给null对象赋值属性就会触发Attempt to assign property "name" on null错误。
  3. (可能)模型未配置可批量赋值字段:若使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:55:14