Как решить проблему SQLSTATE[HY000]: Общая ошибка: 1824 Не удалось открыть таблицу, на которую ссылается laravel?

#mysql #laravel #migration #laravel-8

Вопрос:

Я создал три таблицы миграции таблица user_container предназначена для хранения сведений о пользователе, таблица admin_table предназначена для хранения сведений об администраторе, таблица blog_table предназначена для хранения блогов .администратор может создавать блоги, поэтому я создаю отношение ключа foriegn для администратора к таблице блогов .когда я пытаюсь перенести таблицы, я получаю следующую ошибку

   IlluminateDatabaseQueryException 

  SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'admin_table' (SQL: alter table `blogs_table` add constraint `blogs_table_admin_id_foreign` foreign key (`admin_id`) references `admin_table` (`id`))

 

пожалуйста, помогите мне решить эту проблему, я не понимаю, где я ошибся..

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

2021_08_11_170129_create_Blogs_table.php

 <?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;

class CreateBlogsTable extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('blogs_table', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('price');
            $table->string('country');
            $table->longText('description');
            $table->integer('rating');
            $table->longText('image');
            $table->unsignedInteger('admin_id');
            $table->foreign('admin_id')->references('id')->on('admin_table');
            $table->timestamps();
            //$table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('blogs_table');
    }
}

 

2021_08_12_121933_create_admin_table.php

 <?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;

class CreateAdminTable extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('admin_table', function (Blueprint $table) {
            $table->id();
            $table->string('firstName');
            $table->string('lastName');
            $table->string('email')->unique();
            $table->string('mobile');
            $table->string('password');
            $table->timestamps();
            //$table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('admin_table');
    }
}

 

Комментарии:

1. Ошибка довольно очевидна… Как вы можете ссылаться на другую таблицу, которая не была создана ? Сначала вы создаете blogs_table , а затем создаете admin_table , поэтому при создании blogs_table и запуске миграции она не будет существовать admin_table для ссылки…

Ответ №1:

Сначала вы пытаетесь запустить миграцию в таблице блогов, а затем запустите миграцию в таблице администратора.

Миграция Laravel использует метку времени в начале файла, чтобы решить, какая миграция должна быть перенесена первой в последовательности.

Убедитесь, что вы сначала создали таблицу администратора перед таблицей блога (это также относится ко всем таблицам, на которые есть ссылки). Или просто переименуйте файл (измените метку времени), например:

 2021_08_12_121933_create_admin_table.php
2021_08_11_170129_create_Blogs_table.php
 

К этому:

 2021_08_11_121933_create_admin_table.php
2021_08_12_170129_create_Blogs_table.php
 

Затем запустите php artisan migrate:fresh , чтобы обновить миграцию.

Комментарии:

1. @DevopsTraining вы не должны получать ошибки с этим решением, вам нужно переименовать оба файла

2. Вы также правы, это также нормально, если мы переименуем оба файла.

Ответ №2:

Когда вы настраиваете внешний ключ $table->foreign('admin_id')->references('id')->on('admin_table'); , таблица admin_table еще не существует.

Измените имя миграции таблицы admin_table, которая будет запущена перед именем страницы блога.

2021_08_11_121933_create_admin_table.php

вместо

2021_08_12_121933_create_admin_table.php