在Laravel迁移中获取外键约束不正确的问题

时间:2019-04-16 07:21:03

标签: php laravel database-migration

我想为我的laravel 5.8项目构建Chatter软件包,但是在此迁移文件中出错,它试图用数据库名称创建表,不知道为什么请尝试帮助

2016_07_29_171128_create_foreign_keys.php

<?php

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

class CreateForeignKeys extends Migration
{
    public function up()
    {
        Schema::table('chatter_discussion', function (Blueprint $table) {
            $table->foreign('chatter_category_id')->references('id')->on('chatter_categories')
                        ->onDelete('cascade')
                        ->onUpdate('cascade');
            $table->foreign('user_id')->references('id')->on('users')
                        ->onDelete('cascade')
                        ->onUpdate('cascade');
        });
        Schema::table('chatter_post', function (Blueprint $table) {
            $table->foreign('chatter_discussion_id')->references('id')->on('chatter_discussion')
                        ->onDelete('cascade')
                        ->onUpdate('cascade');
            $table->foreign('user_id')->references('id')->on('users')
                        ->onDelete('cascade')
                        ->onUpdate('cascade');
        });
    }

    public function down()
    {
        Schema::table('chatter_discussion', function (Blueprint $table) {

            $table->dropForeign('chatter_discussion_chatter_category_id_foreign');
            $table->dropForeign('chatter_discussion_user_id_foreign');
        });
        Schema::table('chatter_post', function (Blueprint $table) {
            $table->dropForeign('chatter_post_chatter_discussion_id_foreign');
            $table->dropForeign('chatter_post_user_id_foreign');
        });
    }
}

这是我收到的enter image description here错误

4 个答案:

答案 0 :(得分:0)

外键的格式必须与它所引用的键完全相同。

id通常是int且未签名。

所以我建议您将user_id列创建为:

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

答案 1 :(得分:0)

发生此错误是因为foreign_key与目标表具有不同的数据类型。

默认情况下,Laravel使用increments()作为表的默认id。它将创建一个名为id的列,其数据类型为unsigned integer

您需要使用unsigned integer定义一列才能创建约束。

根据Laravel Docs,您需要执行以下操作

...

// Create a column with unsigned integer as type
$table->unsignedInteger('chatter_category_id');

// Then you can assign it properly
$table->foreign('chatter_category_id')
      ->references('id')
      ->on('chatter_categories')
      ->onDelete('cascade')
      ->onUpdate('cascade');

....

答案 2 :(得分:0)

如果使用laravel 5.8,则id的默认字段为 bigIncrements

像这样:

$table->bigIncrements('id');

,并且必须将 unsignedBigInteger 类型用于外键字段。

像这样:

$table->unsignedBigInteger('chatter_category_id');

祝你好运。

答案 3 :(得分:0)

更改Laravel版本,可以肯定使用,laravel 5.8出现问题

尝试这样

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