Laravel 迁移中的多对多

Posted

技术标签:

【中文标题】Laravel 迁移中的多对多【英文标题】:Many to Many on Laravel migration 【发布时间】:2018-04-29 20:33:56 【问题描述】:

我有 3 个表可以相互连接。表名称的角色、role_user 和用户。我想在 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

【问题讨论】:

如果是多对多关系,您的表是正确的,role_user 上的 FK 也是正确的,但为什么要从您的用户对象中引用角色?我猜那将是一对一的? 嗯,是的,我认为你是对的,我很困惑是否应该输入角色 ID。通常我使用一对多,但我改变了它。所以你认为我应该在我的用户表中推迟我的 role_id 吗? 是的,从您的用户表中删除该列。它对你的多对多关系没有用。 (当然也要去掉外键)。 我照你说的做,现在我得到了这个错误:[Illuminate\Database\QueryException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束(SQL:alter table role_user add约束role_user_role_id_foreign外键(role_id )引用rolesid)在更新级联上删除级联)[PDOException] SQLSTATE [HY000]:一般错误:1215无法添加外键约束 如果我看到添加 FK 的顺序,用户表的 FK 正常吗?那么也许 Roles 表有问题?迁移的运行顺序是什么? 【参考方案1】:

您的问题可能与创建迁移的顺序有关。

Laravel 使用文件名中的时间戳按创建顺序运行迁移,因此,如果您按以下顺序创建它们:

    2018_06_02_023539_create_roles_table 中的角色 2018_06_02_023800_create_role_user_table 中的角色用户 2018_06_02_023815_create_users_table 中的用户

在表role_user 中引用表users 时将不存在,从而导致SQL 错误。 您可以做的最简单的修复方法是以这种方式重命名 role_user 迁移文件:

2018_06_02_023800_create_role_user_table => 2018_06_02_023820_create_role_user_table

【讨论】:

【参考方案2】:

我删除了我所有的桌子,只留下了 4 张桌子:

create_user_table,
create_password_reset, 
create_roles_table, 
create_role_user 

一切正常。

虽然我已经下过相同的订单,但直到现在我还不明白是什么导致了这些错误。

【讨论】:

【参考方案3】:

在数据透视表上试试这个

    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');
    );

【讨论】:

【参考方案4】:

在表“role_user”中将列类型从整数替换为大增量

【讨论】:

以上是关于Laravel 迁移中的多对多的主要内容,如果未能解决你的问题,请参考以下文章

从laravel中的多对多关系中获取单列

如何通过 Laravel 中的多对多关系获取模型

刀片模板中的多对多关系中的 Laravel 嵌套查询

php Laravel中的多对多关系来自一系列ID Raw

如何在Laravel中的多对多关系中添加“别名”?

如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多