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
相关产品推荐
相关产品推荐

