我正在尝试为orders
表创建迁移.此表具有两个表的外键约束:employees
和clients
.
订单表的架构:
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
orders
add constraint orders_employee_id_foreign foreign key(employee_id
)referencesemployees
(id
))
我拉出了它试图使用的查询并直接在数据库上尝试并得到了同样的错误:
-- Query: alter table `orders` add constraint orders_employee_id_foreign foreign key (`employee_id`) references `employees` (`id`)
就错误而言,我有点困惑.约束设置与clients
约束相同并且成功创建:
我用来创建每个约束的语法匹配.是否有理由创造一个而不是另一个?
@ PabloDigiani检查迁移创建顺序的解决方案是正确的; 该orders
表是在employees
导致错误的表之前创建的.
解决方案是确保employees
迁移在 `命令之前运行.
我要补充的另一个方面是如何重新排序laravel中的迁移.它在文档中说明:
每个迁移文件名都包含一个时间戳,允许Laravel确定迁移的顺序.
当我检查时间戳顺序时,employees
之后orders
(只是我通过工匠创建迁移的任意顺序):
修复非常简单:重命名迁移,employees
以便它的时间戳在之前orders
:
简单的修复.再次感谢!
使用Laravel迁移数据库时,检查表的创建顺序非常重要.在这种情况下,应该在orders表之前创建employees表.否则,将抛出外键约束错误.
只需更改表创建的顺序,您的迁移就会顺利运行.