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实例:
- 修改路由,确保参数名和模型主键对应(这里
{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'); }); });
- 修改控制器方法,直接接收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
相关产品推荐
相关产品推荐

