#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