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

Laravel使用Query Builder删除用户报错:Call to a member function delete()求助

问题解析:Call to a member function delete() on non-object in Laravel AuthController

你遇到的这个报错原因很明确——控制器里的$user_id并不是你以为的User模型实例,而是路由传递过来的原始字符串/数字参数,基本数据类型当然没有delete()方法,所以调用它就会抛出这个错误。我们一步步来拆解问题并修复:

核心问题分析

  • 你的AuthController的delete方法直接接收路由中的{user_id}参数,这个参数本质是一个字符串(比如123),不是Eloquent模型对象,所以无法调用模型的delete()方法。
  • 你已经在AuthRepository里写好了删除逻辑,但控制器完全没有用到这个仓库,等于白写了😂。
  • 另外你的AuthRepository里还有两个小问题:
    • User::where('id', $user_id->id)这里,如果仓库的delete参数是用户ID(数字),那$user_id->id是错误的,应该直接用$user_id;
    • 返回response('Success, user was deleted', 204)不太合适,因为HTTP 204状态码要求响应无内容,你写的消息会被客户端忽略;
    • response()->json(error)里的error变量未定义,会引发新的错误。

修复方案

方案1:正确使用AuthRepository

修改AuthController,注入你的AuthRepository,并调用它的删除方法:

class AuthController extends Controller {
    protected $auth;

    // 通过构造函数注入仓库依赖
    public function __construct(IAuthRepository $auth) {
        $this->auth = $auth;
    }

    public function delete($user_id) {
        // 调用仓库的delete方法,传入路由参数的用户ID
        return $this->auth->delete($user_id);
    }
}

同时修正AuthRepository里的错误:

class AuthRepository implements IAuthRepository {
    ....
    public function delete($user_id) {
        // 直接使用传入的user_id,而不是$user_id->id
        $res = User::where('id', $user_id)->delete();
        
        if ($res) {
            // 200状态码返回成功消息,或者用204但不返回内容
            return response()->json(['message' => 'Success, user was deleted'], 200);
            // 如果你坚持用204:return response(null, 204);
        } else {
            // 定义错误内容,返回404或400状态码
            return response()->json(['error' => 'User not found or failed to delete'], 404);
        }
    }
}

方案2:使用路由模型绑定(更简洁)

如果想直接在控制器里操作模型,可以让Laravel自动把路由参数解析成User实例:

  1. 修改路由,确保参数名和模型主键对应(这里{user}对应User模型):
Route::group(['prefix' => 'auth'], function () {
    Route::group(['middleware' => 'auth:api'], function () {
        // 把{user_id}改成{user},Laravel会自动查找对应ID的User实例
        Route::post('user/delete/{user}', 'AuthController@delete');
    });
});
  1. 修改控制器方法,直接接收User模型实例:
class AuthController extends Controller {
    public function delete(User $user) {
        // 直接调用模型的delete方法
        $deleted = $user->delete();
        
        if ($deleted) {
            return response()->json(['message' => 'Success, user was deleted'], 200);
        } else {
            return response()->json(['error' => 'Failed to delete user'], 500);
        }
    }
}

这种方式Laravel会自动处理:如果找不到对应ID的用户,会直接返回404响应,省去了你手动查询的步骤。


内容的提问来源于stack exchange,提问作者copser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:51:14