Laravel本地正常的createToken函数在CPanel部署后报错
解决Laravel上传CPanel后注册功能因
expires_at字段缺失报错的问题 问题场景
将Laravel项目上传至CPanel文件管理器后,本地正常运行的注册功能出现报错,错误信息如下:
Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'expires_at' in 'field list' (Connection: mysql, SQL: insert into `personal_access_tokens` (`name`, `token`, `abilities`, `expires_at`, `tokenable_id`, `tokenable_type`, `updated_at`, `created_at`) values (token, e4188216cb3aedae4c8490310e7217138f62e65273b6aa9883f2d85ab62b3016, ["*"], ?, 17, App\Models\User, 2023-11-27 09:38:25, 2023-11-27 09:38:25)) in file /home/myrout/myprojectname?vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 822
注册接口核心代码(UserController):
public function register(Request $request) { $fields = [ "name" => "required", "phone" => "required|unique:users", "password" => "required", 'gender', 'type', 'university', 'email' ]; $valid = Validator::make($request->all(), $fields); if ($valid->fails()) { $msg = $valid->messages()->first(); return $this->fail($msg); } $password = app('hash')->make($request->password); $phone = $request->phone; $name = $request->name; $gender = $request->gender; $type = $request->type; $university = $request->university; $email = $request->email; $user = User::create([ 'name' => $name, 'phone' => $phone, 'password' => $password, 'gender' => $gender, 'email' => $email, 'type' => $type, 'university' => $university ]); $user = User::find($user->id); $user['token'] = $user->createToken('token')->plainTextToken; return $this->success(new UserResource($user)); }
API路由配置:
//Route::middleware('auth:sanctum')->get('/user', function (Request $request) { // return $request->user(); //}); Route::post('/user/register', [UserController::class,'register']);
问题原因
你猜测的版本不一致是核心问题:本地环境的Laravel/Sanctum版本与CPanel服务器上的版本存在差异,新版本Sanctum生成个人访问令牌时会用到expires_at字段,但服务器上的personal_access_tokens表缺少该字段。
解决步骤
1. 确认版本差异
- 本地项目目录执行:
composer show laravel/sanctum - 登录CPanel,进入项目目录(通过终端功能)执行同样命令,对比两者版本号。
2. 同步表结构
根据版本情况选择以下一种方式:
方式一:执行数据库迁移(推荐)
若服务器版本已与本地匹配,或已升级至对应版本:
- 确认项目根目录
.env文件的数据库配置与CPanel上的数据库信息一致。 - 执行迁移命令:
php artisan migrate - 若服务器从未发布过Sanctum迁移文件,先执行:
再执行迁移。php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
方式二:手动添加字段
若无法执行迁移,直接在CPanel的phpMyAdmin中操作:
- 打开phpMyAdmin,找到项目对应的数据库。
- 进入
personal_access_tokens表的结构编辑页面。 - 添加
expires_at字段,类型选择datetime,设置为允许为空(NULL),保存更改。
3. 验证修复
重新调用注册接口,确认报错消失,功能恢复正常。
内容的提问来源于stack exchange,提问作者adham allan
相关产品推荐
相关产品推荐

