【问题标题】:How to fix the "Base table or view not found: 1146" error when running 'php artisan migrate' command?运行“php artisan migrate”命令时如何修复“未找到基表或视图:1146”错误?
【发布时间】:2016-06-21 23:30:36
【问题描述】:

我正在尝试朗姆酒 php artisan migrate 以生成表迁移,但出现错误:

[2016-03-08 05:49:01] local.ERROR: 异常“PDOException”与 消息“SQLSTATE [42S02]:未找到基表或视图:1146 表 'testing.permissions' 不存在' D:\xampp\htdocs\LMS-testing\vendor\laravel\framework\src\Illuminate\Database\Connection.php:333

我尝试了Base table or view not found: 1146 Table Laravel 5Doing a Laravel tutorial, getting "Base table or view not found: 1146 Table 'sdbd_todo.migrations' doesn't exist",但没有成功。

我也尝试过运行php artisan list,但遇到了同样的错误。

更新

**RolesPermission migration table**

Schema::create('roles', function(Blueprint $table){
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('label');
            $table->string('description')->nullable();
            $table->timestamps();            
        });
        
        Schema::create('permissions', function(Blueprint $table){
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('label');
            $table->string('description')->nullable();
            $table->timestamps();            
        });
        
        Schema::create('permission_role', function(Blueprint $table){
            $table->integer('permission_id')->unsigned();
            $table->integer('role_id')->unsigned();
            
            $table->foreign('permission_id')
                    ->references('id')
                    ->on('permissions')
                    ->onDelete('cascade');
            
            $table->foreign('role_id')
                    ->references('id')
                    ->on('roles')
                    ->onDelete('cascade');
            
            $table->primary(['permission_id', 'role_id']);
        });
        
        Schema::create('role_user', function(Blueprint $table){
            $table->integer('role_id')->unsigned();
            $table->integer('user_id')->unsigned();
            
            $table->foreign('role_id')
                    ->references('id')
                    ->on('roles')
                    ->onDelete('cascade');
            
            $table->foreign('user_id')
                    ->references('id')
                    ->on('users')
                    ->onDelete('cascade');
            
            $table->primary(['role_id', 'user_id']);
            
        });


.env file
APP_ENV=local
APP_DEBUG=true
APP_KEY=W8YWZe3LCngvZzexH3WLWqCDlYRSufuy

DB_HOST=127.0.0.1
DB_DATABASE=testing
DB_USERNAME=root
DB_PASSWORD=

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=log
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

【问题讨论】:

  • 能分享一下迁移文件代码吗?
  • 已更新,请查看。
  • 即使我无法运行 php artisan make 或任何其他命令。我在创建控制器或模型时遇到同样的错误。
  • 你能发布你的 .env 文件,尤其是与数据库连接有关的文件吗?
  • 您解决了您的问题。你能分享一下你是怎么解决的吗?正在为同样的问题而苦苦挣扎。

标签: php laravel laravel-5


【解决方案1】:

我曾经遇到过同样的问题,我想问题不在于您的迁移,但看起来在您在数据库中创建权限表之前检查了权限。确保您的路线中没有添加auth middleware。或注释掉任何使用来自config/app.php 的权限表的服务提供者。最有可能从路由中删除 auth middleware 直到您生成迁移将解决您的问题

【讨论】:

  • 我没有使用默认提供程序,除了 colactive Html。我还从路由中删除了所有代码。仍然出现同样的错误。
  • 在我的情况下这行得通。我不明白为什么它对迁移有任何影响......是否迁移引导 laravel 并检查代码?
【解决方案2】:

我们来看看错误信息:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testing.permissions' doesn't exist

所以表permissions 不存在。现在让我们看看迁移:

Schema::create('permission_role', function(Blueprint $table){
        $table->integer('permission_id')->unsigned();
        $table->integer('role_id')->unsigned();

        $table->foreign('permission_id')
                ->references('id')
                ->on('permissions')
                ->onDelete('cascade');

        $table->foreign('role_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');

        $table->primary(['permission_id', 'role_id']);
    });

我们可以在这个Schema 调用中看到您正在为permissions 表定义一个外键。

有了这个,我们可以假设 Laravel 正在尝试创建这个外键,但是它想要引用的表不存在。

这通常发生在迁移文件的顺序不等于必须创建表的顺序时。因此,如果我的 migrations 文件夹中有此顺序的迁移文件:

2016_10_09_134416_create_permission_role_table 
2016_10_09_134416_create_permissions_table 

它们将按此顺序执行。但如果我知道permission_role 依赖于permissions,我需要通过更改文件名中的时间戳来更改它们的位置:

2016_10_09_134415_create_permissions_table 
2016_10_09_134416_create_permission_role_table 

在这种情况下,我只更改了 create_permissions_table 的最后一位数字,因此它将小于 create_permissions_role_table 的时间戳。在此之后,不要忘记运行:

composer dump-autoload

所以作曲家可以知道你的变化。

【讨论】:

    【解决方案3】:

    问题是添加了外键但找不到表,因为它还没有创建。

    1) 制作没有外键的表

    2) 制作 9999_99_99_999999_create_foreign_keys.php 文件

    3) 把你想要的外键放在那里。使用 999..9 .php 文件,它可以确保在制作表格后最后执行外键。

    4) 您先添加了表,然后添加了外键。这将起作用。

    【讨论】:

      【解决方案4】:

      万一其他人遇到这个问题,我也遇到了同样的问题,原因是我创建了几个命令,然后需要回滚我的数据库以重新运行迁移。

      为了解决这个问题,我不得不注释掉的内容

      protected $commands = []
      

      在 app\Console\Kernel.php 文件中。

      呸!!!! :-)

      【讨论】:

        【解决方案5】:

        我在尝试迁移新数据库时遇到了这个问题。我在 AuthServiceProvider 中有一个选择所有权限的函数。 我评论了那个函数,问题就解决了。

        【讨论】:

        • 这里与使用数据库的共享提供程序相同。
        【解决方案6】:

        它对我有用,在这里查看更多:

        https://stackoverflow.com/a/49300262/5129122

            try {
        
                return Permission::with('role')->get();
        
            } catch (\Exception $e) {
        
                return [];
        
            }
        

        【讨论】:

          【解决方案7】:

          检查你的迁移文件,也许你正在使用 Schema::table,像这样:

          Schema::table('table_name', function ($table)  {
              // ...
          });
          

          如果要创建新表,必须使用 Schema::create:

          Schema::create('table_name', function ($table)  {
              // ...
          });
          

          Laracast More information in this link

          【讨论】:

            【解决方案8】:

            唯一对我有用的解决方案是在迁移之前禁用 config/app.php 中的 PermissionsServiceProvider。

            【讨论】:

              【解决方案9】:

              我也遇到了同样的问题。

              我的解决方案是评论我在 AppServiceProviderboot 方法中添加的内容(因为在那里我有不存在的模型请求)。

              【讨论】:

              • 雅普这个工作!我在 AppServiceProvider 的启动方法上放了一些东西,我应该在迁移之前对其进行评论:fresh --seed
              • 先运行 AppServiceProvider 然后运行迁移!!!这很奇怪。 [我使用 laravel 6]
              • 这个问题的解决方案:stackoverflow.com/a/41997872/6926281
              【解决方案10】:

              我遇到了类似的问题。

              好像我在路由文件中执行了模型查询。所以它每次都会执行,甚至在运行实际迁移之前。

              //Problematic code
              Route::view('users', 'users', [ 'users' => User::all() ]);
              

              所以我改成

              Route::get('/users', function () {
                  return view('users', ['users' => User::all()]);
              });
              

              一切正常。确保执行路径上没有执行任何模型查询,然后尝试迁移。

              【讨论】:

              • 我在 web.php 中有 Auth::loginUsingId 导致错误。谢谢你的提示:)
              【解决方案11】:

              对于那些因为“迁移”表不会自动创建而最终来到这里的人。在某些情况下,您需要运行以下工匠命令:

              php artisan migrate:install
              

              或代码:

              Artisan::call('migrate:install', [
                  '--database' => 'your_database_connection', // optional
              ]);
              

              要获取您的基本“迁移”表,不知道为什么它没有自动生成但确实发生了。

              【讨论】:

                【解决方案12】:

                检查您的所有服务提供商。在其中一种引导方法中,可能会调用尚未运行迁移到的模型。

                【讨论】:

                • 为此,到处搜索!
                猜你喜欢
                • 2023-01-04
                • 2021-08-19
                • 2017-05-31
                • 2017-08-02
                • 2019-01-28
                • 1970-01-01
                • 1970-01-01
                • 2023-03-26
                • 2016-09-07
                相关资源
                最近更新 更多