使用外键添加 laravel 迁移
Posted
技术标签:
【中文标题】使用外键添加 laravel 迁移【英文标题】:Add laravel migrations with foreign keys 【发布时间】:2020-01-23 08:14:11 【问题描述】:我创建了一个名为“users”的表。有名为“companies”、“designations”、“departments”的表。我想将 company_id、designation_id、department_id 列作为外键添加到 users 表中。
我试过了,但是没用
public function up()
Schema::table('users', function (Blueprint $table)
$table->integer('department_id');
$table->integer('company_id');
$table->integer('designation_id');
$table->foreign('department_id')->references('id')->on('departments')->onDelete('restrict')->onUpdate('restrict');
$table->foreign('company_id')->references('id')->on('companies')->onDelete('restrict')->onUpdate('restrict');
$table->foreign('designation_id')->references('id')->on('designations')->onDelete('restrict')->onUpdate('restrict');
);
public function down()
Schema::table('users', function (Blueprint $table)
$table->dropColumn(['department_id','company_id','designation_id']);
);
当我迁移迁移时,它会显示此错误。
Illuminate\Database\QueryException : SQLSTATE[HY000]: 一般 错误:1005 无法创建表
lanwadb
.users
(errno: 150 "Foreign 键约束格式不正确”)(SQL:alter tableusers
add 约束users_department_id_foreign
外键(department_id
) 引用departments
(id
) 上删除限制更新限制)
指定迁移如下,
public function up()
Schema::create('designations', function (Blueprint $table)
$table->increments('id');
$table->string('name');
$table->timestampsTz();
);
部门迁移如下,
public function up()
Schema::create('departments', function (Blueprint $table)
$table->increments('id');
$table->string('name');
$table->integer('company_id');
$table->timestampsTz();
);
```
【问题讨论】:
首先你应该使用unsignedInteger
作为你的外键......特别是如果你将departments
、company
和designation
表ID设置为increment
字段..请还发布其他迁移,以便我们以更精确的方式为您提供帮助......但通常当 Foreign key constraint is incorrectly formed
被抛出时,这是因为 2 列的格式不同
@IlGala 是的,我已经为部门、公司和职务使用了增量字段。
【参考方案1】:
要建立关系,外键字段应为index
ed。这里有三列要用作外键'company_id'
、'department_id'
和'designation_id'
。在 Laravel 迁移中,您可以使用 unsigned()
函数来 index
他们。
例子:
$table->integer('department_id')->unsigned();
$table->integer('company_id')->unsigned();
$table->integer('designation_id')->unsigned();
还有一个名为unsignedInteger()
的函数,您可以通过它创建一个既是整数又是无符号的列。
$table->unsignedInteger('department_id');
$table->unsignedInteger('company_id');
$table->unsignedInteger('designation_id');
【讨论】:
我从你那里学到了新东西。非常感谢您的支持。【参考方案2】:使用这个:
$table->integer('department_id')->unsigned()->nullable();
$table->integer('company_id')->unsigned()->nullable();
$table->integer('designation_id')->unsigned()->nullable();
$table->foreign('department_id')->references('id')->on('departments')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('company_id')->references('id')->on('departments')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('designation_id')->references('id')->on('departments')->onDelete('cascade')->onUpdate('cascade');
【讨论】:
以上是关于使用外键添加 laravel 迁移的主要内容,如果未能解决你的问题,请参考以下文章