如何修复“;未找到基表或视图:1146”;运行时出错';php artisan migrate';命令


How to fix the "Base table or view not found: 1146" error when running 'php artisan migrate' command?

我正在尝试rum php artisan migrate来生成表迁移,但我遇到了一个错误:

〔2016-03-08 05:49:01〕当地。错误:异常"PDOException"带有消息'SQLSTATE[42S02]:找不到基表或视图:1146表中不存在"testing.permissions"D: ''examplep''htdocs''LMS testing''vendor''laravel''framework''src''Illuminate''Database''Connection.php:333

我尝试过没有找到的基本表或视图:1146表Laravel 5和做一个Laravel教程,得到";找不到基表或视图:1146表';sdbd_todo.migrations';不会';t存在";但没有成功。

我也尝试过运行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

检查迁移文件,可能您使用的是Schema::table,如下所示:

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

如果你想创建一个新表,你必须使用Schema::create:

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

Laracast更多信息请点击此链接。

我刚刚遇到了同样的问题。

我的解决方案是评论我在AppServiceProviderboot方法中输入的内容(因为在那里我有不存在的Model请求(。

我运行它来解决类似的问题。

看起来我在routes文件中执行了一个Model查询。因此,它每次都会执行,甚至在运行实际迁移之前。

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

所以我把它改成

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

一切都很好。请确保执行路径上没有超出任何Model查询,然后尝试迁移。

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

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

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

1( 制作没有外键的表

2( 制作9999_99_99_999999_create_foregard_keys.php文件

3( 把你想要的外国钥匙放在那里。对于999..9.php文件,它确保在生成表之后最后执行外键。

4( 您先添加了表,然后添加了外键。这会奏效的。

让我们看看错误消息:

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

所以作曲家可以意识到你的变化。

它对我有效,请参阅此处的更多信息:

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

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

我曾经遇到过同样的问题,我想问题不在迁移中,而是在DB中创建权限表之前检查权限。请确保您的路线中没有添加auth middleware。或者注释掉使用来自CCD_ 15的权限表的任何服务提供商。最有可能的是,在生成迁移之前,从路由中删除auth middleware将解决您的问题

如果其他人也遇到了同样的问题,我只是遇到了相同的问题,发生这种情况的原因是我创建了几个命令,然后需要回滚数据库来重新运行迁移。

为了修复它,我不得不注释掉的内容

protected $commands = []

app''Console''Cernel.php文件中。

呜呜!!!:-(

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

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

php artisan migrate:install

OR带代码:

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

要获得基本的"迁移"表,不确定为什么它不是自动生成的,但它确实发生了。

请在AppServiceProvider上检查您的启动方法。如果您在那里使用任何模型请求,请对它们进行注释并再次迁移。您的问题将得到解决