Миграция laravel "SQL: изменить таблицу` posts`, добавить ограничение `posts_category_id_foreign` внешний ключ (` category_id`) ссылается на `category` (` id`) " - PullRequest
0 голосов
/ 09 июля 2019

я пытаюсь выполнить миграцию laravel, но получаю эту ошибку

[Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1005 Can't create table `urbancruise`.`#sql-18f8_112` (errno: 150 "Foreign key cons
  traint is incorrectly formed") (SQL: alter table `posts` add constraint `posts_category_id_foreign` foreign key (`c
  ategory_id`) references `categories` (`id`))

вот мой код

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

public function down(){
    Schema::drop('categories');
}

public function up(){
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->bigInteger('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories');
        $table->timestamps();
    });
}

public function down(){
    Schema::drop('posts');
}

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Когда вы создаете внешний ключ, categories.id и posts.category_id должны иметь одинаковый тип. Поменяйте ->bigInteger() на ->integer(), чтобы решить вашу проблему:

Ваши категории миграции:

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

public function down(){
    Schema::drop('categories');
}

В ваших публикациях миграция:

public function up(){
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id', false, true);
        //Or $table->unsignedInteger('category_id');
        $table->foreign('category_id')
            ->references('id')
            ->on('categories');
        $table->timestamps();
    });
}

public function down(){
    Schema::drop('posts');
}

Надеюсь, это поможет.

1 голос
/ 10 июля 2019

Внешний ключ должен всегда иметь одинаковый тип как в дочерней, так и в родительской таблице.

В вашем случае categories.id относится к типу INTEGER, а posts.category_id определяется как BIGINT. Замена posts миграции на ниже должна работать.


public function up() {
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories');
        $table->timestamps();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...