【问题标题】:Laravel Sanctum : column not found: 1054 Unknown column 'api_token' in 'where clause'Laravel Sanctum:未找到列:1054 'where 子句'中的未知列'api_token'
【发布时间】:2020-07-23 06:08:33
【问题描述】:

包裹:圣所

在请求获取数据时生成令牌后,它会抛出这样的错误

Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'api_token' in   
'where clause' (SQL: select * from `users` where `api_token` = XAzuNGUeOJ8CXbIoGEWhBTtWIFr0lFr8jjwScXQ4B0Qxfmu
2cHm9LaUwGX96zy0AnXhLLcCnBFCodQaOlimit 1) in file

【问题讨论】:

  • users 表中是否存在api_token 列?
  • 也许忘记了迁移?
  • 同样的错误,你解决了吗?
  • 在 kernel.php 中导入 EnsureFrontendRequestsAreStateful 以进行令牌验证。使用 Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStatefulin api 部分
  • @hakiko 是的,请检查此链接stackoverflow.com/a/65472868/9077019

标签: php laravel laravel-sanctum


【解决方案1】:

转到 config/auth.php

并将守卫中的 api 数组更改为 sanctum 示例:

 'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

【讨论】:

  • 确实如此。很高兴他们把它放在他们的文档中。浪费了几个小时。
  • 它没有解决我的问题。我清除所有缓存。我正在使用 v8 :(
  • 谢谢!在最新的 laravel 版本中,他们默认移除了 API 保护。谢谢,它有效。 php artisan config:clear php artisan cache:clear php artisan config:cache
【解决方案2】:

转到routes/api.php 并使用它

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

而不是

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

【讨论】:

    【解决方案3】:

    在 api.php 中

    Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
        return $request->user();
    });
    

    在 config/auth.php 中

    'api' => [
        'driver' => 'sanctum',
        'provider' => 'users',
        'hash' => false,
    ],
    

    之后,它将解决问题。我已经把代码上传到我的GitHub了。https://github.com/ramseyjiang/laravel_8_api

    【讨论】:

    • 虽然此代码可能会回答问题,但添加一些关于其解决方式和原因的解释将提高您的回答质量
    【解决方案4】:

    kernel.php中导入EnsureFrontendRequestsAreStateful进行令牌验证

    use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
    
    class Kernel extends HttpKernel
    {
    
        'api' => [
                   ------
                   EnsureFrontendRequestsAreStateful::class,
                   ------
                 ],
    }
    

    【讨论】:

      【解决方案5】:

      运行迁移,然后检查,如果仍然存在问题,那么users 表没有api_token 字段,或者它没有在User 模型中的$fillable 数组中定义。

      【讨论】:

        【解决方案6】:

        您可以尝试为您的 api 路由添加“middleware(auth:sanctum)”。

        例子:

        Route::middleware('auth:sanctum')->get('products', function() {
              //code
        })->name('api.products');
        

        【讨论】:

          【解决方案7】:

          运行

          1. php artisan 缓存:清除
          2. php 工匠配置:清除
          3. php 工匠路线:清除

          然后重新启动 Apache 和 Mysql(用于 XAMPP/WAMPP)并再次运行 artisan serve 命令 它对我有用。确保你先阅读他们的文档

          【讨论】:

          • 这是一种典型的缓存清除方法,但是它如何帮助解决问题呢?
          【解决方案8】:

          1.为了回答这个问题,我绞尽脑汁,决定清除应用程序、配置和路由缓存,这对我有用。

            php artisan cache:clear
          

          2.当您希望清除应用程序缓存时,您可以在控制台中运行上述语句。它的作用是该语句清除 storage\framework\cache 中的所有缓存。

            php artisan route:cache
          

          3.这将清除您的路由缓存。因此,如果您添加了新路由或更改了路由控制器或操作,您可以使用它重新加载相同的。

            php artisan config:cache
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-17
            • 2021-05-06
            • 2020-03-01
            • 2020-06-08
            • 1970-01-01
            • 2021-07-22
            • 2021-07-10
            • 1970-01-01
            相关资源
            最近更新 更多