在laravel

时间:2017-11-01 09:53:56

标签: php mysql laravel foreign-keys

我正在尝试在user_details表中创建一个外键。 我的user_details表中有2个外键,其中一个是引用Sentinel创建的主用户表中用户ID的user_id。我还有一个国家/地区表,我希望将country_of_origin字段设置为countries表中的国家/地区数字代码。但每次执行迁移时我都会收到以下错误

"Foreign key constraint is incorrectly formed"

我的国家/地区表的架构

 public function up()
{
    Schema::create('countries', function (Blueprint $table) {
        $table->collation = 'utf8_general_ci';
        $table->charset = 'utf8';
        $table->integer('id');
        $table->string('name');
        $table->string('alpha_2');
        $table->string('alpha_3');
        $table->timestamps();
        $table->engine = 'InnoDB';
    });
}

id字段是ISO 3166-1数字国家/地区代码,而不是行的自动增量ID。此外,此表的数据是使用播种器从JSON文件提供的。

我的用户详细信息表格的模式

public function up()
{
    Schema::create('user_details', function (Blueprint $table) {
        $table->increments('id',true);
        $table->integer('user_id')->unsigned();
        $table->string('date_of_birth');
        $table->integer('country_of_origin')->unsigned();
        $table->integer('contact_number');
        $table->timestamps();
        $table->engine = 'InnoDB';
    });
    Schema::table('user_details', function($table) {
        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('country_of_origin')->references('id')->on('countries');
    });
}

在执行user_details迁移之前,首先执行用于创建国家/地区表的迁移。

如果我删除$table->foreign('country_of_origin')->references('id')->on('countries');我没有收到任何错误。我也试过$table->integer('country_of_origin');,但我仍然得到同样的错误。

解决方案 问题是因为国家/地区表中的id字段的名称,但实际上,它不是自动增量col,而是基于种子数据具有固定值。

我按如下方式更改了我的架构 国家架构

 public function up()
{
    Schema::create('countries', function (Blueprint $table) {
        $table->collation = 'utf8_general_ci';
        $table->charset = 'utf8';
        $table->increments('id',true);
        $table->integer('num_id')->unique();
        $table->string('name');
        $table->string('alpha_2');
        $table->string('alpha_3');
        $table->timestamps();
        $table->engine = 'InnoDB';
    });
}

为自动增量ID添加了一个额外字段,并将SO 3166-1数字国家/地区代码存储在num_id字段中

用户详细信息表中的

,刚刚更改了以下内容

 $table->foreign('country_of_origin')->references('num_id')->on('countries');

2 个答案:

答案 0 :(得分:1)

id表中的

countries必须是主键

答案 1 :(得分:0)

public function up()
{
    Schema::create('countries', function (Blueprint $table) {
        $table->collation = 'utf8_general_ci';
        $table->charset = 'utf8';
        $table->integer('countryid')->unique();
        $table->string('name');
        $table->string('alpha_2');
        $table->string('alpha_3');
        $table->timestamps();
        $table->engine = 'InnoDB';
    });
}