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

Laravel搭配Sanctum+MongoDB调用createToken时报prepare() on null错误

错误原因

该报错本质是Sanctum默认的PersonalAccessToken模型仅适配MySQL等关系型数据库,继承自Laravel原生Eloquent ORM,无法适配MongoDB驱动的查询逻辑,执行令牌插入操作时无法获取正确的数据库连接实例,因此抛出Call to a member function prepare() on null错误。

解决方案

1. 自定义适配MongoDB的PersonalAccessToken模型

新建app/Models/PersonalAccessToken.php文件,代码如下:

<?php

namespace App\Models;

use Jenssegers\Mongodb\Eloquent\Model;
use Laravel\Sanctum\Contracts\HasAbilities;

class PersonalAccessToken extends Model implements HasAbilities
{
    protected $fillable = [
        'name',
        'token',
        'abilities',
        'last_used_at',
    ];

    protected $casts = [
        'abilities' => 'json',
        'last_used_at' => 'datetime',
    ];

    public function tokenable()
    {
        return $this->morphTo('tokenable');
    }

    public function can($ability): bool
    {
        $abilities = $this->abilities ?? [];
        return in_array('*', $abilities) || in_array($ability, $abilities);
    }

    public function cant($ability): bool
    {
        return !$this->can($ability);
    }
}

2. 注册自定义模型到Sanctum

打开app/Providers/AuthServiceProvider.php,在boot方法中添加注册逻辑:

use Laravel\Sanctum\Sanctum;
use App\Models\PersonalAccessToken;

public function boot()
{
    $this->registerPolicies();
    
    // 告知Sanctum使用自定义的MongoDB适配模型
    Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
}

3. 修正personal_access_tokens集合的迁移文件

MongoDB为无模式数据库,原关系型数据库风格的字段定义无效,替换迁移代码为:

Schema::create('personal_access_tokens', function ($collection) {
    $collection->unique('token');
    $collection->index(['tokenable_id', 'tokenable_type']);
});

其他说明

你之前尝试将name字段改为token_base_name无法解决问题,createToken方法的第一个参数是name字段的存储值,不是字段名,无需修改字段定义,改回原有配置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:45:10