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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:59