Laravel - различия в 5,4 В и 5,8 В во внешнем ключе - PullRequest
0 голосов
/ 13 января 2020

Чем отличаются внешние ключи для версий Laravel 5.4 и Laravel 5.8? Я попытался установить devdojo/chatter на свой проект 5.8 версии Laravel, и при переносе он показывает все виды ошибок для внешнего ключа, но когда я пробую его на версии 5.4, он работает довольно хорошо, ошибок вообще нет. Пожалуйста, помогите, я не могу найти решение, и оно мне нужно в моем проекте. Спасибо!

Это моя ошибка: SQLSTATE[HY000]: General error: 1005 Can't create table `cdm`.`chatter_discussion` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `chatter_discussion` add constraint `chatter_discussion_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade on update cascade)

Это моя таблица chatter_discussion:

<?php

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

class CreateChatterDiscussionTable extends Migration
{
    public function up()
    {
        Schema::create('chatter_discussion', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('chatter_category_id')->unsigned()->default('1');
            $table->string('title');
            $table->integer('user_id')->unsigned();
            $table->boolean('sticky')->default(false);
            $table->integer('views')->unsigned()->default('0');
            $table->boolean('answered')->default(0);
            $table->timestamps();
        });
    }

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

А это foreign_keys таблица:

<?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');
        });
    }
}

Ответы [ 2 ]

2 голосов
/ 13 января 2020

При Laravel 5.4 все столбцы id имеют тип increments по умолчанию, но при Laravel 5.8 это bigIncrements по умолчанию. Поэтому измените user_id тип столбца на bigInteger в таблице chatter_discussion, чтобы решить вашу проблему:

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

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

1 голос
/ 13 января 2020

Существует проблема в https://github.com/thedevdojo/chatter/issues/257, описывающая это.

Проблема заключается в шаблонной миграции пользователя Первичный ключ изменен с increments на bigIncrements вас поэтому необходимо изменить ссылки:

class CreateChatterDiscussionTable extends Migration
{
    public function up()
    {
        Schema::create('chatter_discussion', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('chatter_category_id')->unsigned()->default('1');
            $table->string('title');
            $table->bigInteger('user_id')->unsigned();
            $table->boolean('sticky')->default(false);
            $table->integer('views')->unsigned()->default('0');
            $table->boolean('answered')->default(0);
            $table->timestamps();
        });
    }

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

Примечание. Проблема github предлагает изменить миграцию пользователя, но я настоятельно рекомендую вам этого не делать, поскольку есть веская причина, по которой он был изменен с самого начала. С тобой, наверное, все будет хорошо, но ты никогда не узнаешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...