Laravel Passport自定义列名引发SQL错误求助
嗨,这个问题我太熟了!本质就是Laravel框架默认约定用户表的主键是id,但你把主键改成了USER_ID,Passport在处理API认证请求时依然按照默认字段去查询用户,这才触发了"Unknown column 'id' in 'where clause'"的错误。下面是具体的适配解决方案,亲测有效:
解决Laravel Passport因自定义用户主键导致的查询错误
1. 给User模型指定自定义主键
首先打开你的app/Models/User.php文件,给模型添加两个关键属性,告诉Laravel你的主键字段是什么:
class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // 声明你的自定义主键字段名 protected $primaryKey = 'USER_ID'; // 补充:如果你的`USER_ID`不是自增整数类型(比如是字符串UUID),把这个值改成false;如果是自增int,保持true就行 public $incrementing = true; // ... 其他原有代码不用动 }
2. (可选)适配Passport的Token关联(如果第一步没解决的话)
大部分情况下,只要User模型正确声明了主键,Laravel的ORM关联会自动适配。但如果还是有问题,就需要手动指定Passport的Token模型和User模型的关联字段:
先创建一个自定义的AccessToken模型:
// 创建 app/Models/Passport/AccessToken.php 文件 namespace App\Models\Passport; use Laravel\Passport\AccessToken as PassportAccessToken; class AccessToken extends PassportAccessToken { // 重写user关联,指定关联的外键和主键 public function user() { return $this->belongsTo(\App\Models\User::class, 'user_id', 'USER_ID'); } }
然后在AuthServiceProvider里注册这个自定义模型,让Passport用它来处理token:
// 打开 app/Providers/AuthServiceProvider.php use App\Models\Passport\AccessToken; use Laravel\Passport\Passport; public function boot() { $this->registerPolicies(); Passport::routes(); // 替换默认的AccessToken模型为我们自定义的 Passport::useAccessTokenModel(AccessToken::class); }
3. 清除缓存,测试请求
最后别忘了清除Laravel的配置缓存,确保新设置生效:
php artisan config:clear php artisan cache:clear
现在再发送API请求,应该就不会再出现主键找不到的错误啦!
内容的提问来源于stack exchange,提问作者JacopoStanchi
相关产品推荐
相关产品推荐

