迁移:无法添加外键约束


206

我试图在Laravel中创建外键,但是当我使用我的表进行迁移artisan时,抛出以下错误:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `priorities` add constraint priorities_user_id_foreign foreign 
key (`user_id`) references `users` (`id`))     

我的迁移代码是这样的:

优先级迁移文件

public function up()
{
    //
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

用户迁移文件

public function up()
{
    //
    Schema::table('users', function($table)
    {
    $table->create();
    $table->increments('id');
    $table->string('email');
    $table->string('first_name');
    $table->string('password');
    $table->string('email_code');
    $table->string('time_created');
    $table->string('ip');
    $table->string('confirmed');
    $table->string('user_role');
    $table->string('salt');
    $table->string('last_login');

    $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
        Schemea::drop('users');
}

关于我做错了什么的任何想法,我想现在就解决,因为我需要创建很多表,例如用户,客户,项目,任务,状态,优先级,类型,团队。理想我想创建与外键,i..e持此数据表clients_projectproject_tasks等。

希望有人可以帮助我入门。

Answers:


356

分两步添加它,也可以使它也未签名是很好的:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });

   Schema::table('priorities', function($table) {
       $table->foreign('user_id')->references('id')->on('users');
   });

}

117
谢谢,安东尼奥!对我来说,问题是没有在user_id列上添加unsigned(),使其与用户表上id列的数据类型匹配。Laravel的增量('id')函数创建一个无符号整数,因此外键列也需要无符号。
布拉德·格里菲斯

7
添加unsigned,除了分离到Schema::table方法之外,还很有帮助!谢谢!
patrickjason91 2015年

4
对我而言,这并不是使ID成为未签名的。谢谢你的提示。
卡尔·威斯

6
解决方案在@BradGriffith的注释中。如上所述,我根本不需要分开。也许最好相应地更新答案。
Matanya '16

11
使用$table->unsignedBigInteger('user_id'),如果你的user.id是bigIncrements
马克西姆·伊万诺夫

114

问题已经回答,但希望这可以对其他人有所帮助。

发生此错误的原因是,我先在其中创建了带有外键的迁移表,然后才将该键作为主键存在于其原始表中。迁移按照创建后的顺序执行,如运行后生成的文件名所示migrate:make。例如2014_05_10_165709_create_student_table.php

解决方案是按照以下建议将具有外键的文件重命名为比具有主键的文件更早的时间:http : //forumsarchive.laravel.io/viewtopic.php?id=10246

我想我也必须添加 $table->engine = 'InnoDB';


4
重命名迁移文件并遇到类似以下错误之后:无法打开流:没有此类文件或目录(并且未显示旧的迁移名称),您必须运行:composer dump-autoload
Stelian,2015年

14
$ table-> engine ='InnoDB'; 在MySql级别强制执行外键是必需的。默认的laravel引擎是MyIsam,但不支持外键!
弗朗索瓦·布雷顿

2
这也对我有用,谢谢。但是这种方式起作用对我来说有点奇怪。我的意思是说,这是有道理的,但除了手动重命名文件并在过程中提供假日期外,还应该有一种方法指定迁移执行的顺序
allisius

2
我来到这里并不是因为遇到任何错误,而是能够向作为外键的列添加错误的值。然后我看到了有关InnoDB的评论和答案。很高兴知道。谢谢大家:)
SuperNOVA

2
迁移时,创建迁移的顺序仍然很重要。我遇到了这个问题,但这解决了它。
mugabits

60

拉拉威尔^ 5.8

从Laravel 5.8开始,迁移存根默认情况下在ID列上使用bigIncrements方法。以前,使用增量方法创建ID列。

这不会影响您项目中的任何现有代码。但是,请注意,外键列必须具有相同的类型。因此,使用增量方法创建的列不能引用使用bigIncrements方法创建的列。

资料来源:Migrations&bigIncrements


假设您正在构建一个简单的基于角色的应用程序,并且需要在PIVOT“ role_user”中引用user_id

2019_05_05_112458_create_users_table.php

// ...

public function up()
{
    Schema::create('users', function (Blueprint $table) {

        $table->bigIncrements('id');

        $table->string('full_name');
        $table->string('email');
        $table->timestamps();
    });
}

2019_05_05_120634_create_role_user_pivot_table.php

// ...

public function up()
{
    Schema::create('role_user', function (Blueprint $table) {

        // this line throw QueryException "SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint..."
        // $table->integer('user_id')->unsigned()->index();

        $table->bigInteger('user_id')->unsigned()->index(); // this is working
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

如您所见,注释行将引发查询异常,因为如升级说明中所述,外键列必须为同一类型,因此您需要将前键(在此示例中为user_id)更改为BIGINTEGERROLE_USER表或改变bigIncrements方法增量的方法,用户表,并使用数据透视表中的注释行,就看你了。


希望我能向您澄清这个问题。


1
谢谢。你救了我的命。按照您的解释,我按照您的建议将外键更改为bigInteger。 Schema::table('goal_objective', function (Blueprint $table) { $table->bigInteger('job_title_id')->after('target')->unsigned()->nullable(); $table->foreign('job_title_id')->references('id')->on('job_titles')->onDelete('set null'); } 有效。谢谢。
布鲁斯·汤

1
@BruceTong,很高兴我能够提供帮助。
chebaby

1
是的,这是最相关的答案。
Mohd Abdul Mujib

1
这个答案很有帮助。
卡里姆·帕佐基

1
最佳答案。谢谢
VishalParkash

49

就我而言,问题在于主表中已经有记录,并且我正在强制新列不为NULL。因此,在新列中添加-> nullable()可以达到目的。在问题的示例中将是这样的:

$table->integer('user_id')->unsigned()->nullable();

要么:

$table->unsignedInteger('user_id')->nullable();

希望这对某人有帮助!


请注意,父表中的“ id”列也需要取消签名!使用$ table-> increments('id')等行;将自动默认为unsigned。
Colin Stadig

这对我有用。我将父表ID的数据类型从BigIncrements更改为增量。
伊曼纽尔·本森

22

在我的情况下,问题在于该users表的自动生成的迁移正在设置

...
$table->bigIncrements('id');
...

所以我不得不改变列的类型


$table->bigInteger('id');

使我可以使用外键工作进行迁移。

这与laravel 5.8.2


由于外键列必须具有与它所引用的列相同的类型
Daniele,

9
这为我工作$ table-> unsignedBigInteger('user_id'); 在拉拉维尔5.8。*
亚当·温尼帕斯

我在5.8中也遇到了这个问题,这对我来说已经解决了!谢谢!
Mike Sheward

从漫长的夜晚救了我!
chq

19

在我的情况下,问题在于迁移时间安排,在创建迁移时首先要注意创建子迁移而不是基本迁移。因为如果首先创建具有外键的基本迁移,则将查找子表,而不会有表会引发异常。

更多:

创建迁移时,它的开头有一个时间戳。假设您已经创建了一只迁移猫,所以它看起来像2015_08_19_075954_the_cats_time.php,并且具有以下代码

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class TheCatsTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cat', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');  
            $table->date('date_of_birth');
            $table->integer('breed_id')->unsigned()->nullable(); 
        });

        Schema::table('cat', function($table) {
        $table->foreign('breed_id')->references('id')->on('breed');
      });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('cat');
    }
}

在创建基本表之后,您将创建另一个迁移品种,即子表,它具有自己的创建时间和日期戳。代码如下:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class BreedTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('breed', function (Blueprint $table) {
             $table->increments('id');    
             $table->string('name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('breed');
    }
}

看来这两个表都是正确的,但是当您运行php artisan migration时。它将引发异常,因为迁移首先会在数据库中创建基表,因为您首先创建了此迁移,并且我们的基表具有外键约束,该约束将查找子表,而子表不存在,这很可能一个例外

所以:

首先创建子表迁移。

创建子迁移后,创建基表迁移。

php artisan迁移。

完成就可以了


13

就我而言,我只是更改了手动执行的订单迁移,因此首先创建了表用户。

在文件夹database / migrations /中,您的迁移文件名具有以下格式:year_month_day_hhmmss_create_XXXX_table.php

只需重命名创建用户文件,即可将表优先级表的创建日期设置为晚于用户日期(即使再延迟一秒钟也足够)


13

在laravel 5.8中,users_table使用bigIncrements('id')数据类型作为主键。这样,当您要引用外键约束时,user_id需要unsignedBigInteger('user_id')输入列。


非常感谢,我花了一个小时试图弄清楚为什么外键会导致异常
Ya Basha

10

我在使用Laravel 5.8时遇到了同样的问题在仔细研究了laravel文档之后,这里还有Migrations&bigIncrements。我解决问题的方法是在与表“ users”及其关联相关的每个表中添加主键“ $ table-> bigIncrements('id')”,在本例中为表“ role”。最后,我有“ $ table-> unsignedBigInteger”用于将角色与用户(多对多)相关联,即表“ role_user”

1. Users table

    Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

2. Roles Table
    Schema::create('roles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name')->unique();
        $table->string('display_name')->nullable();
        $table->string('description')->nullable();
        $table->timestamps();
    });

3. Table role_user
Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('role_id');
            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('roles')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->primary(['user_id', 'role_id']);
        });

9

我在laravel 5.8中遇到了这个问题,并将此代码(如Laravel文档中所示)修复到我要添加外键的位置。

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

然后我跑了 $ php artisan migrate:refresh

由于此语法相当冗长,因此Laravel提供了其他更简洁的方法,这些方法使用约定来提供更好的开发人员体验。上面的示例可以这样写:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
});

7

使用Laravel 5.3有同样的问题。

解决方案是使用unsignedInteger而不是integer('name')-> unsigned()

所以这是有效的

$table->unsignedInt('column_name');
$table->foreign('column_name')->references('id')->on('table_name');

起作用的原因是,当使用integer('name')-> unsigned时,表中创建的列的长度为11,而当使用unsigedInteger('name')时,列的长度为10。

长度10是使用Laravel时主键的长度,因此列的长度匹配。


伙计,谢谢你,因为我刚找到你的帖子,我将放弃并运行原始sql。我将不得不阅读有关为何laravel主键的长度必须为10的更多信息,以及是否有任何原因为什么做integer('column')-> unsigned()应该不同于unsigedInteger('column')
Arnaud Bouchot

6

对于我来说,发生此错误是因为-我试图创建的表是InnoDB时-我试图将其关联到的外部表是MyISAM表!


MyISAM不支持外键约束。之所以可行,是因为切换到MyISAM使其完全忽略了外键,这可能是有原因的。小心。
greggle138

5

除非创建相关表,否则我们无法添加关系。Laravel按迁移文件的日期运行迁移顺序。因此,如果您要使用第二个迁移文件中存在的表创建关系,它将失败。

我遇到了同样的问题,因此我最后又创建了一个迁移文件来指定所有关系。

Schema::table('properties', function(Blueprint $table) {
        $table->foreign('user')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('area')->references('id')->on('areas')->onDelete('cascade');
        $table->foreign('city')->references('id')->on('cities')->onDelete('cascade');
        $table->foreign('type')->references('id')->on('property_types')->onDelete('cascade');
    });

    Schema::table('areas', function(Blueprint $table) {
        $table->foreign('city_id')->references('id')->on('cities')->onDelete('cascade');
    });

1
您如何命名文件?9999_99_99_999999_create_foreign_keys.php?
Iannazzi 2016年

在迁移文件名中添加9999_99_99_99999是个坏主意,因为它将破坏回滚功能。
莫里克·甘加尼

5

请注意:当Laravel使用

$table->increments('id');

在大多数迁移中都是标准配置,这将设置一个无符号整数字段。因此,当从另一个表对该字段进行外部引用时,请确保在引用表中将字段设置为UnsignedInteger而不是UnsignedBigInteger字段(我假设是该字段)。

例如:在迁移文件2018_12_12_123456_create_users_table.php中:

Schema::create('users', function (Blueprint $table){
    $table->increments('id');
    $table->string('name');
    $table->timestamps();

然后在迁移文件2018_12_12_18000000_create_permissions_table.php中,该文件将外部引用设置回给用户:

Schema::create('permissions', function (Blueprint $table){
    $table->increments('id');
    $table->UnsignedInteger('user_id'); // UnsignedInteger = "increments" in users table
    $table->boolean('admin');
    $table->boolean('enabled');
    $table->timestamps();

    // set up relationship
    $table->foreign('user_id')->reference('id')->on('users')->onDelete('cascade');
}

5

你应该这样写

public function up()
{
    Schema::create('transactions', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->float('amount', 11, 2);
        $table->enum('transaction type', ['debit', 'credit']);
        $table->bigInteger('customer_id')->unsigned();      
        $table->timestamps();                 
    });

    Schema::table('transactions', function($table) {
        $table->foreign('customer_id')
              ->references('id')->on('customers')
              ->onDelete('cascade');
    });     
}

外键字段应该是未签名的,希望对您有所帮助!!


不仅是无符号的,而且当它引用bigIncrements列时,也应该是unsigedBigInteger
gondwe

4

为了在laravel中添加外键约束,以下对我有用:

  1. 创建列作为外键,如下所示:

    $ table-> integer('column_name')-> unsigned();
  2. 在(1)之后立即添加约束线,即

    $ table-> integer('column_name')-> unsigned();
    $ table-> foreign('column_name')-> references('pk_of_other_table')-> on('other_table');

3

我知道这是一个古老的问题,但请确保是否使用引用来定义正确的支持引擎。为两个表设置innodb引擎,为引用列设置相同的数据类型

$table->engine = 'InnoDB';

2

在最初的问题发生几年后,使用laravel 5.1在这里进行提示,我遇到了相同的错误,因为我的迁移是使用所有相同的日期代码由计算机生成的。我仔细研究了所有建议的解决方案,然后进行重构以查找错误源。

在接下来的热门节目中,以及在阅读这些文章时,我相信正确的答案类似于Vickies的答案,不同之处在于您不需要添加单独的架构调用。您不需要将表设置为Innodb,我假设laravel现在正在这样做。

只是需要正确地安排迁移的时间,这意味着您将为需要外键的表修改文件名中的日期代码(后)。替代地或附加地,降低不需要外键的表的日期代码。

修改日期代码的优点是您的迁移代码将更易于阅读和维护。

到目前为止,我的代码正在通过向上调整时间代码来工作,以推迟需要外键的迁移。

但是我确实有数百个表,所以最后我只有一个外键表。只是为了让事情顺利进行。我假设我将它们拉入正确的文件并在测试它们时修改日期代码。

举个例子:文件2016_01_18_999999_create_product_options_table。这需要创建产品表。查看文件名。

 public function up()
{
    Schema::create('product_options', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('product_attribute_id')->unsigned()->index();
        $table->integer('product_id')->unsigned()->index();
        $table->string('value', 40)->default('');
        $table->timestamps();
        //$table->foreign('product_id')->references('id')->on('products');
        $table->foreign('product_attribute_id')->references('id')->on('product_attributes');
        $table->foreign('product_id')->references('id')->on('products');


    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('product_options');
}

产品表:这需要首先迁移。2015_01_18_000000_create_products_table

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

        $table->string('style_number', 64)->default('');
        $table->string('title')->default('');
        $table->text('overview')->nullable();
        $table->text('description')->nullable();


        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('products');
}

最后,在最后,我将临时使用该文件来解决问题,当我编写名为9999_99_99_99_999999_create_foreign_keys.php的模型的测试时,将重构该文件。在我拔出这些键时会对其进行注释,但是您明白了。

    public function up()
    {
//        Schema::table('product_skus', function ($table) {
//            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
//    });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
//        Schema::table('product_skus', function ($table)
//        {
//            $table->dropForeign('product_skus_product_id_foreign');
//        });

2

很简单 !!!

如果您是第一个创建'priorities'迁移文件,则Laravel 'priorities''users'表不存在时首先运行。

如何将关系添加到不存在的表中!

解决方案:从 表中拉出 外键代码'priorities'。您的迁移文件应如下所示:

在此处输入图片说明

并添加到新的迁移文件中,其名称为create_prioritiesForeignKey_table并添加以下代码:

public function up()
{        
    Schema::table('priorities', function (Blueprint $table) {          
        $table->foreign('user_id')
              ->references('id')
              ->on('users');                        
    });
}

2

确保您的前柱超出了前柱的范围

我的意思是您的前钥匙(在第二张表中)必须与您的ponter主键(在第一张表中)相同

您的指针主键必须添加无符号方法,让我展示:

在您的第一个迁移表上:

$table->increments('column_name'); //is INTEGER and UNSIGNED

在您的第二个迁移表上:

$table->integer('column_forein_name')->unsigned(); //this must be INTEGER and UNSIGNED
$table->foreign('column_forein_name')->references('column_name')->on('first_table_name');

差异的另一个例子

在您的第一个迁移表上:

$table->mediumIncrements('column_name'); //is MEDIUM-INTEGER and UNSIGNED

在您的第二个迁移表上:

$table->mediumInteger('column_forein_name')->unsigned(); //this must be MEDIUM-INTEGER and UNSIGNED
$table->foreign('column_forein_name')->references('column_name')->on('first_table_name');

请参见MYSQL数值类型表范围


2

我注意到的一件事是,如果表使用的引擎与外键约束不同,则无法使用。

例如,如果一个表使用:

$table->engine = 'InnoDB';

和其他用途

$table->engine = 'MyISAM';

会产生一个错误:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

您可以通过在表创建结束时添加InnoDB来解决此问题,如下所示:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedInteger('business_unit_id')->nullable();

        $table->string('name', 100);

        $table->foreign('business_unit_id')
                ->references('id')
                ->on('business_units')
                ->onDelete('cascade');

        $table->timestamps();
        $table->softDeletes();
        $table->engine = 'InnoDB'; # <=== see this line
    });
}


1

要点是外来方法用于ALTER_TABLE将预先存在的字段转换为外键。因此,您必须在应用外键之前定义表类型。但是,它不必在单独的Schema::调用中。您可以在create中完成这两项操作,如下所示:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

还要注意,将的类型user_id设置为无符号以匹配外键。


1

您可以在整数列中直接传递布尔参数,说该参数应该是无符号的。在laravel 5.4中,以下代码解决了我的问题。

        $table->integer('user_id', false, true);

在此,第二个参数false表示不应自动递增,第三个参数true表示应无符号。您可以在同一迁移中保留外键约束或将其分开。它对两个都有效。


1

如果以上解决方案均不适用于新手,请检查两个ID的类型是否相同:都是integer或都为bigInteger,...您可以输入以下内容:

主表(例如用户)

$table->bigIncrements('id');

子表(例如优先级)

$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

该查询将失败,因为users.id是一个BIG INTEGER,而priorities.user_idINTEGER

在这种情况下,正确的查询如下:

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

1

就我而言,它直到我运行命令后才起作用

composer dump-autoload

这样,您可以将外键保留在创建模式中

public function up()
{
    //
     Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
 }

 /**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

1

也可能是您创建迁移的顺序。如果先创建优先级表,然后再创建用户表,那将是错误的。由于第一次迁移,正在寻找用户表。因此,您必须更改迁移的顺序

app/database/migrations

目录


1

对我来说,我的子表引用的表列未建立索引。

Schema::create('schools', function (Blueprint $table) {
    $table->integer('dcid')->index()->unque();
    $table->integer('school_number')->index(); // The important thing is that this is indexed
    $table->string('name');
    $table->string('abbreviation');
    $table->integer('high_grade');
    $table->integer('low_grade');
    $table->timestamps();
    $table->primary('dcid');
});

Schema::create('students', function (Blueprint $table) {
      $table->increments('id');
      $table->integer('dcid')->index()->unique()->nullable();
      $table->unsignedInteger('student_number')->nullable();
      $table->integer('schoolid')->nullable();
      $table->foreign('schoolid')->references('school_number')->on('schools')->onDelete('set null');
      // ...
});

忽略可怕的命名,它来自另一个设计糟糕的系统。


1

有时由于迁移顺序而可能会出现此错误。

像用户和订单是两个表

订单表具有用户的前键(在迁移过程中,如果先迁移订单表,则会引起问题,因为没有用户可以匹配外键)

解决方案:只需将您的“订单更新”表放在用户下方即可进行更新

示例:就我而言,教育和大学表教育表

public function up()
{
    Schema::create('doc_education', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('uni_id')->unsigned()->nullable();
        $table->timestamps();
    });
}

在大学

    Schema::create('doc_universties', function (Blueprint $table) {
        $table->increments('id');
        $table->string('uni_name');
        $table->string('location')->nullable();
        $table->timestamps();

        //
    });



Schema::table('doc_education', function(Blueprint $table) {
        $table->foreign('uni_id')->references('id')
        ->on('doc_universties')->onDelete('cascade');
    });

0

我认为这里的答案缺少一件事,如果我错了,请更正我,但是外键需要在数据透视表上建立索引。至少在mysql中似乎是这样。

public function up()
{
    Schema::create('image_post', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('image_id')->unsigned()->index();
        $table->integer('post_id')->unsigned()->index();
        $table->timestamps();
    });

    Schema::table('image_post', function($table) {
        $table->foreign('image_id')->references('id')->on('image')->onDelete('cascade');
        $table->foreign('post_id')->references('id')->on('post')->onDelete('cascade');
    });

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.