Laravel更新偏好设置表报错:Call to undefined method save()
解决Laravel中
Call to undefined method Builder::save()的问题 嘿,我来帮你搞定这个报错!咱们先搞清楚问题出在哪:
当你写$preferences = preferences::where('user_id', $user_id);的时候,这行代码返回的是Query Builder构建器对象,而不是你的preferences模型实例。save()是Eloquent模型实例才有的方法,所以直接调用就会触发这个“方法未定义”的错误。
另外你注释掉的那行DB::table('preferences')->where(...)->first(),返回的是普通的PHP对象(stdClass),同样不是Eloquent模型,也没法用save()方法。
给你两种靠谱的解决办法,按需选就行:
方法一:先获取模型实例再更新
这种方式适合需要先读取原有数据,或者要触发模型事件(比如updated钩子)的场景:
public function update(Request $request, $user_id) { // 通过user_id找到对应的模型实例 $preferences = preferences::where('user_id', $user_id)->first(); // 一定要先检查是否找到记录,避免后续操作报错 if (!$preferences) { return abort(404, '用户偏好设置不存在'); } // 给模型属性赋值(替换成你实际要更新的字段) $preferences->determine_notifications = $request->input('notifications'); $preferences->default_language = $request->input('language'); // ...其他字段 // 调用模型的save()方法保存更新 $preferences->save(); // 返回成功响应,比如重定向回原页面 return redirect()->back()->with('success', '偏好设置更新成功'); }
方法二:直接用Query Builder批量更新
如果不需要读取原有数据,也不需要触发模型事件,这种方式更高效:
public function update(Request $request, $user_id) { // 直接通过where条件执行更新操作 $updatedRows = preferences::where('user_id', $user_id)->update([ 'determine_notifications' => $request->input('notifications'), 'default_language' => $request->input('language'), // ...其他需要更新的字段 ]); // 检查是否有行被更新(0表示没找到记录或者没有修改) if ($updatedRows === 0) { return abort(404, '用户偏好设置不存在或无需更新'); } return redirect()->back()->with('success', '偏好设置更新成功'); }
另外提醒一下:你的控制器方法里有个preferences $preferences参数,这是Laravel的路由模型绑定,但它是通过主键来查找模型的。而你是用user_id来定位记录的,这个参数其实没用,反而可能导致路由匹配问题,建议直接删掉它。
内容的提问来源于stack exchange,提问作者mkirr
相关产品推荐
相关产品推荐

