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

Laravel中使用控制器更新数据库报错:非静态方法不能静态调用

解决 "Non-static method Illuminate\Database\Eloquent\Model::update() should not be called statically" 错误

这个错误的核心原因很直白:你直接通过模型类静态调用了update()方法,但Eloquent的update()默认是实例方法——它需要先绑定到具体的模型记录实例上才能执行,不能直接用Myroutes::update()这种静态方式调用(除非你明确要批量更新且指定了筛选条件)。

下面分两种常见场景给出解决方案:

场景1:更新单条特定记录(最常用的编辑场景)

这是后台编辑功能的常规逻辑:先根据ID(或其他唯一标识)定位到要修改的记录,再调用实例的update()方法更新字段。

步骤1:修改路由,传递记录ID

首先要在路由里传入要更新的记录ID,让控制器能精准找到目标记录:

// web.php
Route::post('/my-updated-routes/{id}', 'MyroutesController@update');

步骤2:修改控制器代码

先通过findOrFail()获取目标实例(找不到会自动抛出404错误),再调用实例的update()方法:

public function update(Request $request, $id) {
    // 定位到要编辑的路由记录
    $myRoute = Myroutes::findOrFail($id);
    
    // 调用实例的update方法更新字段
    $myRoute->update([
        'start' => $request->start,
        'end' => $request->end
        // 这里补充其他需要更新的字段
    ]);
    
    // 可选:添加成功提示并跳转回原页面
    return redirect()->back()->with('success', '路由信息更新成功');
}

场景2:批量更新多条记录

如果你确实需要一次性更新多条符合条件的记录,可以静态调用update(),但必须搭配where()条件锁定更新范围(否则会误更新表中所有记录,风险极高!):

public function update(Request $request) {
    // 示例:更新所有起点为旧值的路由记录
    Myroutes::where('start', $request->old_start)
           ->update([
               'start' => $request->start,
               'end' => $request->end
               // 补充其他需要批量更新的字段
           ]);
}

关键总结

  • 单条记录更新:必须先获取模型实例,再调用实例的update()方法
  • 批量更新:静态调用时一定要加where()条件,避免无差别修改全表数据

内容的提问来源于stack exchange,提问作者Just101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:52:18