未找到Laravel 5 Migrate Base表或视图:1146

时间:2016-03-08 06:12:25

标签: php laravel laravel-5.2

我遇到了大问题。我试图朗读php artisan migrate来生成表格迁移,但我得到了  [2016-03-08 05:49:01] local.ERROR: exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testing.permissions' doesn't exist' in 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

12 个答案:

答案 0 :(得分:5)

检查您的迁移文件,也许您正在使用Schema :: table,如下所示:

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

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

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

Laracast More information in this link

答案 1 :(得分:2)

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

1)制作没有外键的表

2)制作一个9999_99_99_999999_create_foreign_keys.php文件

3)把你想要的外键放在那里。使用999..9 .php文件,它确保在表格完成后它会持续使用外键。

4)您先添加了表,然后添加了外键。这将有效。

答案 2 :(得分:1)

让我们看一下错误信息:

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)

我尝试迁移新数据库时遇到此问题。我在AuthServiceProvider中有一个选择所有权限的函数。 我评论说功能和问题是固定的。

答案 4 :(得分:1)

它对我有用,请在此处查看更多信息

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

    try {

        return Permission::with('role')->get();

    } catch (\Exception $e) {

        return [];

    }

答案 5 :(得分:1)

我遇到了类似的问题。

好像我在routes文件中执行了Model查询。因此,它每次都会执行,甚至在运行实际迁移之前也是如此。

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

所以我将其更改为

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

要修复它,我必须注释掉

的内容
protected $commands = []

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

呼!!!! : - )

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我只是遇到了同样的问题。

我的解决方案是评论我在boot的{​​{1}}方法中输入的内容(因为在那里我有Model请求,而该请求不再存在了)。

答案 10 :(得分:0)

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

php artisan migrate:install

OR或代码:

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

要获取基本的“迁移”表,请不确定为什么它不会自动生成但确实发生了。

答案 11 :(得分:0)

检查所有服务提供商。在一种引导方法中,可以调用一个模型,该模型尚未运行。