Ошибка исключения запроса базы данных миграции Laravel - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь написать миграцию базы данных laravel с иностранными связями. во время миграции базы данных выдается ошибка исключения запроса.

Мне надоело переносить таблицы с использованием правил laravel, но во время переноса это показало неожиданную ошибку.

Таблица пользователей

    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name', 150);
        $table->string('email', 150)->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('phone', 150);
        $table->unsignedBigInteger('role_id');
        $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

Таблица ролей

    Schema::create('roles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('role_name',255);
        $table->longText('role_description',255);
        $table->integer('sort_order');
        $table->enum('status',['A','I','D'])->comment('A-active','I-inactive,D-delete'); 
        $table->enum('is_deleted',['Y','N'])->comment('Y-yes,N-no');
        $table->timestamps();
        $table->bigInteger('created_by');
        $table->bigInteger('updated_by')->default(0);
        $table->bigInteger('deleted_by')->default(0);
        $table->timestamp('deleted_at')->nullable();
    });

Подсветка \ База данных \ QueryException: SQLSTATE [HY000]: общая ошибка: 1215 Невозможно добавить ограничение внешнего ключа (SQL: изменить таблицу jt_users добавить ограничение users_role_id_foreign внешний ключ (role_id) ссылки jt_roles (id) на каскад удаления)

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Вы не можете добавить внешний ключ в таблицу, которая не существует. В вашем случае вы пытаетесь создать role_id до создания таблицы roles.

При миграции таблицы roles вам нужно будет обновить таблицу users после создания таблицы roles:

Schema::create('roles', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('role_name',255);
    $table->longText('role_description',255);
    $table->integer('sort_order');
    $table->enum('status',['A','I','D'])->comment('A-active','I-inactive,D-delete'); 
    $table->enum('is_deleted',['Y','N'])->comment('Y-yes,N-no');
    $table->timestamps();
    $table->bigInteger('created_by');
    $table->bigInteger('updated_by')->default(0);
    $table->bigInteger('deleted_by')->default(0);
    $table->timestamp('deleted_at')->nullable();
});

Schema::table('users', function (Blueprint $table) {
    $table->unsignedBigInteger('role_id');
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});

Примечание: Используйте Schema::table() вместо Schema::create() при внесении изменений в таблицу.

В методе down() миграции roles необходимо удалить внешний ключ и поле:

Schema::table('users', function (Blueprint $table) {
    $table->dropForeign(['role_id']);
    $table->dropColumn('role_id');
});
0 голосов
/ 07 июня 2019

сначала таблица с «первичным ключом» (пользователи) должна быть перенесена

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