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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:55:59