Laravel Sanctum用UUID作关联ID时创建令牌报错求助
解决Laravel Sanctum结合UUID主键用户生成令牌的类型错误问题
你的问题根源很明确:Laravel Sanctum默认生成的personal_access_tokens表中,tokenable_id字段是无符号整数类型,但你的User模型用UUID作为主键(字符串类型),两者类型不匹配导致插入时触发SQL错误。必须修改个人令牌表的字段类型来适配UUID,具体步骤如下:
1. 修改personal_access_tokens表的tokenable_id字段类型
首先生成一个迁移文件来修改字段:
php artisan make:migration modify_tokenable_id_in_personal_access_tokens_table
打开生成的迁移文件,替换up和down方法内容:
public function up() { Schema::table('personal_access_tokens', function (Blueprint $table) { // 先删除原有的联合索引 $table->dropIndex(['tokenable_type', 'tokenable_id']); // 将tokenable_id改为字符串类型(UUID标准长度为36) $table->string('tokenable_id', 36)->change(); // 重新创建联合索引 $table->index(['tokenable_type', 'tokenable_id']); }); } public function down() { Schema::table('personal_access_tokens', function (Blueprint $table) { $table->dropIndex(['tokenable_type', 'tokenable_id']); // 回滚为原整数类型 $table->unsignedBigInteger('tokenable_id')->change(); $table->index(['tokenable_type', 'tokenable_id']); }); }
运行迁移生效:
php artisan migrate
2. 确保User模型的UUID配置正确
检查User模型是否正确设置了主键类型和自增属性:
class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // 声明主键为字符串类型 protected $keyType = 'string'; // 禁用自增主键 public $incrementing = false; // 其他模型代码... }
3. 验证令牌生成逻辑
确认LoginController的__invoke方法中,令牌生成代码是基于认证后的User实例调用的,示例代码如下:
public function __invoke(Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (!Auth::attempt($request->only('email', 'password'))) { return response()->json(['message' => '登录凭证无效'], 401); } $user = Auth::user(); // 生成并返回令牌 $token = $user->createToken('login-token')->plainTextToken; return response()->json(['access_token' => $token]); }
完成以上步骤后,Sanctum就能正常为UUID主键的User模型生成令牌了。
内容的提问来源于stack exchange,提问作者Francisco Morales
相关产品推荐
相关产品推荐

