当前位置:  开发笔记 > 后端 > 正文

无法使用Laravel 5迁移添加外键约束

如何解决《无法使用Laravel5迁移添加外键约束》经验,为你挑选了1个好方法。

我正在尝试为orders表创建迁移.此表具有两个表的外键约束:employeesclients.

订单表的架构:

Schema::create('orders', function (Blueprint $table) {
    $table->increments('id');

    $table->integer('client_id')->unsigned();
    $table->foreign('client_id')->references('id')->on('clients');

    $table->integer('employee_id')->unsigned();
    $table->foreign('employee_id')->references('id')->on('employees');

    $table->text('description');
    $table->string('status');
    $table->date('submitted_on');
    $table->date('completed_on');
    $table->timestamps();
});

employees表的架构:

Schema::create('employees', function (Blueprint $table) {
    $table->increments('id');
    $table->string('type');
    $table->timestamps();
});

clients表的架构:

Schema::create('clients', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
    $table->timestamps();
});

当我运行迁移时,会为clients表成功创建约束,但由于某种原因,在尝试为employees创建约束时会出错:

[Illuminate\Database\QueryException] SQLSTATE [HY000]:常规错误:1215无法添加外键约束(SQL:alter table ordersadd constraint orders_employee_id_foreign foreign key(employee_id)references employees(id))

我拉出了它试图使用的查询并直接在数据库上尝试并得到了同样的错误:

-- Query:
alter table `orders` add constraint orders_employee_id_foreign foreign key (`employee_id`) references `employees` (`id`)

MySQL错误

就错误而言,我有点困惑.约束设置与clients约束相同并且成功创建:

表格信息来自Sequel Pro

我用来创建每个约束的语法匹配.是否有理由创造一个而不是另一个?

一边说

@ PabloDigiani检查迁移创建顺序的解决方案是正确的; 该orders表是在employees导致错误的表之前创建的.

解决方案是确保employees迁移 `命令之前运行.

我要补充的另一个方面是如何重新排序laravel中的迁移.它在文档中说明:

每个迁移文件名都包含一个时间戳,允许Laravel确定迁移的顺序.

当我检查时间戳顺序时,employees之后orders(只是我通过工匠创建迁移的任意顺序):

错误的迁移顺序

修复非常简单:重命名迁移,employees以便它的时间戳在之前orders:

正确的迁移顺序

简单的修复.再次感谢!



1> 小智..:

使用Laravel迁移数据库时,检查表的创建顺序非常重要.在这种情况下,应该在orders表之前创建employees表.否则,将抛出外键约束错误.

只需更改表创建的顺序,您的迁移就会顺利运行.


当你改变迁移的文件名时不要忘记运行`composer dump-autoload`将更新文件列表
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有