Laravel报错Call to a member function update() on integer求解决方案
解决Laravel中
Call to a member function update() on integer错误的思路 这个错误的核心很明确:你尝试调用update()方法的变量根本不是Laravel的Eloquent模型实例,而是一个整数。这种情况几乎都是在获取advert数据的环节出了问题,下面给你几个具体的排查和解决方向:
1. 检查获取Advert模型的代码
最常见的坑是误将返回整数的查询结果赋值给了$advert变量。比如:
- 如果你用了
Advert::where('id', $id)->update($data),这个方法返回的是受影响的行数(整数),而不是模型实例; - 或者不小心用了
count()、delete()这类返回数字的方法。
正确的做法是确保拿到的是模型实例,推荐用findOrFail()或者firstOrFail(),这样如果找不到数据会直接抛出404,避免后续操作出错:
$advert = Advert::findOrFail($id); // 根据ID获取模型,找不到就报错 // 或者按其他条件查询 $advert = Advert::where('slug', $request->slug)->firstOrFail();
2. 利用路由模型绑定简化代码
Laravel的路由模型绑定可以直接帮你把路由参数转换成模型实例,完全避免手动查询的错误。比如:
路由定义
Route::put('/adverts/{advert}', [AdvertController::class, 'update']);
控制器方法
public function update(Request $request, Advert $advert) { // 这里的$advert已经是对应的模型实例了,直接调用update即可 $advert->update($request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string', // 其他字段的验证规则 ])); return redirect()->route('adverts.show', $advert)->with('success', '广告更新成功'); }
3. 排查表单提交的参数
如果手动查询模型,要确保表单提交的id参数是有效的:
- 用
$request->dd()打印所有提交的数据,确认id字段存在且是正确的数值; - 避免在查询时使用错误的条件,比如把
$request->id写成了$request->advert_id这类笔误。
4. 验证变量类型
如果还是不确定问题出在哪,可以在调用update()前打印变量类型:
dd($advert); // 看看输出是模型实例还是整数/其他类型
如果输出是整数,那回到前面的步骤,检查获取$advert的代码逻辑。
错误示例 vs 正确示例
错误写法(会触发报错)
public function update(Request $request) { // 这里的update返回受影响行数(整数) $advert = Advert::where('id', $request->id)->update($request->all()); // 试图给整数调用update(),必然报错 $advert->update(['status' => 1]); }
正确写法
public function update(Request $request, $id) { $advert = Advert::findOrFail($id); $validatedData = $request->validate([ // 验证规则 ]); $advert->update($validatedData); return redirect()->back()->with('success', '更新完成'); }
内容的提问来源于stack exchange,提问作者user9277589
相关产品推荐
相关产品推荐

