使用外键添加 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 table users 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作为你的外键......特别是如果你将departmentscompanydesignation表ID设置为increment字段..请还发布其他迁移,以便我们以更精确的方式为您提供帮助......但通常当 Foreign key constraint is incorrectly formed 被抛出时,这是因为 2 列的格式不同 @IlGala 是的,我已经为部门、公司和职务使用了增量字段。 【参考方案1】:

要建立关系,外键字段应为indexed。这里有三列要用作外键'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 迁移的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 表迁移:无法添加外键约束

Laravel 5.3 迁移:1215 无法添加外键约束

迁移问题:无法在laravel中添加外键约束

Laravel 迁移无法添加外键

Laravel 迁移:无法添加外键约束

MySQL数据库的Laravel迁移“无法添加外键约束”错误