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

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. 同步表结构

根据版本情况选择以下一种方式:

方式一:执行数据库迁移(推荐)

若服务器版本已与本地匹配,或已升级至对应版本:

  1. 确认项目根目录.env文件的数据库配置与CPanel上的数据库信息一致。
  2. 执行迁移命令:
    php artisan migrate
    
  3. 若服务器从未发布过Sanctum迁移文件,先执行:
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    
    再执行迁移。

方式二:手动添加字段

若无法执行迁移,直接在CPanel的phpMyAdmin中操作:

  1. 打开phpMyAdmin,找到项目对应的数据库。
  2. 进入personal_access_tokens表的结构编辑页面。
  3. 添加expires_at字段,类型选择datetime,设置为允许为空(NULL),保存更改。

3. 验证修复

重新调用注册接口,确认报错消失,功能恢复正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:32:41