Laravel 5.2 Entrust migrate 错误,无法添加外键约束

Laravel 5.2 Entrust migrate error, cannot add foreign key constraints

我安装并配置了 Laravel 5.2,它工作正常,对于 User ACL 我安装了 zizaco/entrust 包,而 运行 这个命令 php artisan migrate(对于创建 rolespermissions table 等)出现以下错误

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table role_user add constraint role_user_user_id_foreign foreign key (user_id) references `` (id) on delete cascade on update cascade)

[PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

可能是什么原因?我错过了什么吗?我遵循了 entrust site

的明智步骤指南

当我尝试在同一个迁移(同一个 Schema::create 块)中添加外键时,有时会遇到同样的错误。如果我在创建新列的地方创建迁移:

Schema::create(...
    ...
    $table->integer('categories_id')->unsigned();
    ...
});

然后在同一个文件中,我将此列设置为外键:

Schema::table('sub_categories', function (Blueprint $table) {
    $table->foreign('categories_id')->references('id')->on('main_categories');
});

完美运行。

希望对您有所帮助。

我解决了这个问题,在委托迁移文件中,缺少 users table 名称。见下行

$table->foreign('user_id')->references('id')->on(' ')->onUpdate('cascade')->onDelete('cascade');

所以我改成了这样,

$table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');

我添加了 users table 名称,问题已解决。

原因,为什么我遇到这个问题?

config/auth.php 文件中,providers 数组中没有提到 'table'=>'users' key/pair,见下文(这是默认设置,意味着安装新的 laravel 时)

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

while php artisan entrust:migration 命令 运行s,它从上面的提供者数组中提取 users table 名称,如果没有提到 table 那么在迁移文件,关系设置为空。

$table->foreign('user_id')->references('id')->on('')->onUpdate('cascade')->onDelete('cascade');

所以,像这样在提供程序数组中添加 table。

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
        'table'=>'users'
    ],

之后 运行 委托迁移命令 php artisan entrust:migration 这将生成正确的迁移文件。

如果您使用了 GitHub 或 Whosebug 中给出的所有其他解决方案而没有解决您的问题,那么请从数据库管理面板中删除用户 table 并在 用户中进行一些更改迁移 文件。将 bigIncrements('id'); 更改为 Increment('id') 转到数据库管理面板,如果你使用 MySQL 转到 PHPmyadmin 面板,转到数据库,然后这里的用户将 id 的数据类型从 bigint(20)int(10).