Laravel迁移中的多对多关系

10
我有三个表需要相互连接。这些表的名称是roles、role_user和users。我想在laravel上进行迁移并添加一些限制。以下是我的角色表迁移内容:
    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('description');
        $table->timestamps();
    });

这是我的用户表迁移:
Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('username')->unique();
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->boolean('active')->default(0);
    $table->softDeletes();
    $table->rememberToken();
    $table->timestamps();
});

这是我的 role_user 表迁移文件:
    Schema::create('role_user', function (Blueprint $table) {
        $table->integer('role_id')->unsigned();
        $table->integer('user_id')->unsigned();

        $table->unique(['role_id', 'user_id']);
        $table->foreign('role_id')->references('id')->on('roles')
            ->onDelete('cascade')->onUpdate('cascade');
        $table->foreign('user_id')->references('id')->on('users')
            ->onDelete('cascade')->onUpdate('cascade');
    });

在我的迁移顺序中,我已经将角色表放在用户表之上,但我仍然遇到了这种错误:
  [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `role_user` add constraint `role_user_role_id_foreign` foreign key (`role_id
  `) references `roles` (`id`) on delete cascade on update cascade)



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

嗯,我认为你是对的,我对是否应该放置roles_id感到困惑。通常我使用一对多,但我改变了它。那么你认为我应该在我的用户表中取消role_id吗? - Ying
是的,请从您的用户表中删除该列。它对于您的多对多关系没有用处。(当然也要删除外键)。 - Fjarlaegur
如果我看到FK被添加的顺序,用户表的FK就没问题了吧?那么也许Roles表有问题?迁移的顺序是什么? - Fjarlaegur
角色表,用户表,角色用户关联表。 - Ying
也许这与创建表的顺序有关。检查 role_user 表是否在最后创建。此外,在回滚时,请检查约束是否也被删除。更多参考资料请参见此处 - Pathros
显示剩余5条评论
4个回答

6
也许你的问题是关于创建迁移顺序的。
Laravel默认按照文件名中的时间戳顺序执行迁移,因此如果您按照以下顺序创建迁移:
1. 角色在`2018_06_02_023539_create_roles_table` 2. 角色用户在`2018_06_02_023800_create_role_user_table` 3. 用户在`2018_06_02_023815_create_users_table`
当在表`role_user`中引用表`users`时,表`users`尚不存在,从而导致SQL错误。
您可以轻松解决此问题,只需将`role_user`迁移文件重命名为:
`2018_06_02_023800_create_role_user_table => 2018_06_02_023820_create_role_user_table`

4
尝试在数据透视表上进行此操作。
    public function up()
{
    Schema::create('role_user', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('role_id');
        $table->unsignedBigInteger('user_id');
        $table->timestamps();
        $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

1

在表 "role_user" 中,将列类型从整数更改为 bigIncrements


1
请注意:Laravel 5.8将bigIncrements作为默认值添加 https://laraveldaily.com/be-careful-laravel-5-8-added-bigincrements-as-defaults/ - Robin Bastiaan

-1

我删除了所有表格,只留下了4个表格:

create_user_table,
create_password_reset, 
create_roles_table, 
create_role_user 

一切都正常工作。

到目前为止,我还不明白是什么原因导致这些错误,尽管我已经放置了相同的命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接