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

Laravel 9 Sanctum:如何修改personal_access_tokens表的内置迁移

修改Laravel Sanctum的Personal Access Tokens表适配UUID用户表

有两种靠谱的方法解决这个问题,你可以根据项目阶段选择:

方法一:替换默认迁移文件(适合新项目/未执行原迁移的场景)

如果还没运行过Sanctum的迁移,直接替换迁移文件最省事:

  • 先确认数据库migrations表中没有2019_12_14_000001_create_personal_access_tokens_table这条记录,要是有就删掉(已经执行过原迁移的话,跳过这个方法看方法二)。
  • 生成自己的迁移文件:
    php artisan make:migration create_personal_access_tokens_table
    
  • 打开新生成的迁移文件,替换默认内容为Sanctum原迁移的代码,把$table->morphs('tokenable');改成$table->uuidMorphs('tokenable');,完整代码示例:
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    return new class extends Migration
    {
        public function up()
        {
            Schema::create('personal_access_tokens', function (Blueprint $table) {
                $table->id();
                $table->uuidMorphs('tokenable'); // 替换为uuidMorphs
                $table->string('name');
                $table->string('token', 64)->unique();
                $table->text('abilities')->nullable();
                $table->timestamp('last_used_at')->nullable();
                $table->timestamp('expires_at')->nullable();
                $table->timestamps();
            });
        }
    
        public function down()
        {
            Schema::dropIfExists('personal_access_tokens');
        }
    };
    
  • 执行迁移:
    php artisan migrate
    

方法二:新增修改字段的迁移(适合已执行原迁移的项目)

如果已经跑过原迁移,不想改动已有的迁移记录,就新增一个迁移来修改字段:

  • 生成修改迁移文件:
    php artisan make:migration modify_tokenable_fields_in_personal_access_tokens_table
    
  • 在迁移文件的up方法里删除原有tokenable字段,再添加UUID版本的;down方法用于回滚操作:
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    return new class extends Migration
    {
        public function up()
        {
            Schema::table('personal_access_tokens', function (Blueprint $table) {
                $table->dropMorphs('tokenable');
                $table->uuidMorphs('tokenable');
            });
        }
    
        public function down()
        {
            Schema::table('personal_access_tokens', function (Blueprint $table) {
                $table->dropUuidMorphs('tokenable');
                $table->morphs('tokenable');
            });
        }
    };
    
  • 执行迁移:
    php artisan migrate
    

注意:如果项目已经有用户和令牌数据,修改字段前一定要备份数据库!原tokenable_id是整数类型,改成UUID(字符串类型)后,要确保现有令牌的tokenable_id能正确匹配用户表的UUID(比如之前用户表是整数ID后来改成UUID,可能需要先迁移关联数据)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:05:24