非静态方法‘update’不应被静态调用,如何解决该Laravel错误?
报错原因及修复方案
报错原因
- 错误调用
update方法:Laravel Eloquent模型的update()是实例方法,必须通过已获取的模型对象(比如find/findOrFail拿到的实例)调用,不能用Grade::update()这种静态方式调用,这就是"non static method 'update' should not be called statically"错误的核心原因。 - 变量覆盖逻辑错误:你先通过
Grade::find($id)获取了模型实例,但紧接着用$grade = $request->validate(...)把实例覆盖成了验证后的纯数组,导致后续无法调用实例方法。 - 两处拼写错误:
slig应为slug,返回字段staus应为status。
修复后的代码
public function update(Request $request) { // 用findOrFail替代find,找不到对应ID时自动抛出404异常,更严谨 $grade = Grade::findOrFail($request->id); // 验证数据并存入单独变量,避免覆盖模型实例 $validatedData = $request->validate([ 'title' => 'required|string', 'slug' => 'string', 'description' => 'string', ]); // 通过模型实例调用update方法完成更新 $grade->update($validatedData); return [ 'status' => 'success', 'grade' => $grade, ]; }
补充说明
如果需要批量更新多条记录,Laravel确实支持静态update()方法,但需搭配查询条件,比如Grade::where('id', $id)->update($validatedData),不过这种方式不会触发模型的生命周期事件(比如updated钩子),单条记录更新建议用实例调用的方式。
内容的提问来源于stack exchange,提问作者Muhammad Talha
相关产品推荐
相关产品推荐

