SQLSTATE[HY000]: общая ошибка: 1 неизвестный столбец "user_id" в определении внешнего ключа
У меня есть эта ошибка при запуске:
php artisan migrate:fresh
Освещение \Database\QueryException: SQLSTATE[HY000]: общая ошибка: 1 неизвестный столбец "user_id" в определении внешнего ключа (SQL: создать таблицу "users" ("id" integer, не ноль, автоинкремент первичного ключа, "name" varchar не ноль, "email" varchar not null, "username" varchar not null, "email_verified_at" datetime null, "password" varchar not null, "Remember_token" varchar null, "create_at" datetime null, "updated_at" datetime null, внешний ключ ("user_id") ссылки"users"("id") на каскад удаления))
Я следую видеоурок на YouTube, и код учебника это:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProfilesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('profiles');
}
}
Если я скопирую и вставлю этот код, у меня будет ошибка. Поэтому я искал на стеке потока и я нашел это решение:
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
Schema::table('profiles', function (Blueprint $table){
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('profiles');
}
Это моя таблица пользователей:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('users');
}
Но сегодня, когда я бегу php artisan migrate:fresh
У меня была эта ошибка снова.
Как я могу решить?
Спасибо
4 ответа
Как уже упоминали другие, user_id
не столбец в вашем users
таблица, но вы пытаетесь создать индекс по ней. Эта строка:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
принадлежит в profiles
Схема создания таблицы, а не в users
схема создания таблицы.
Полный код:
// create_users_table.php
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
// create_profiles_table.php <-- migrate AFTER users table
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
Попробуй это;
public function up()
{
Schema::dropIfExists('profiles');
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
Это миграция. Прежде чем вы сможете запустить его; удалите строку для "CreateProfilesTable" в таблице миграции.
Ошибка явно упоминается здесь:
foreign key("user_id") references "users"("id") on delete cascade)
и у вас нет столбца с именем user_id
Синтаксис:
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns) <-- this must be a column in the table
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
но в твоем случае user_id
столбец недоступен в запросе. Поэтому либо добавьте этот столбец, либо удалите этот код ограничения и повторите попытку.
Причиной этой проблемы является то, что таблица профиля была создана до пользовательской таблицы. У меня есть хитрость для решения проблемы.
Вы должны переименовать файлы миграции в каталоге миграции.
например, пусть мои имена файлов будут такими
- 2019_06_10_000001_create_users_table.php
- 2019_06_10_000002_create_profiles_table.php
первая пользовательская таблица создается, когда вы запускаете "ремесленник мигрировать или мигрировать: свежий"
Почему? потому что первый созданный файл миграции - это пользовательский файл. Вы должны внимательно посмотреть
- 2019_06_10_000001 -> имя таблицы пользователей
- 2019_06_10_000002 -> имя таблицы профилей
Решение: Так что вам просто нужно сделать это: переименовать таблицу "user" и назвать ее численно меньше, чем таблица "profile". Так что проблема решится.
Другое решение: удалить все файлы миграции после запуска их соответственно этой команды.
php artisan make:migration create_users_table
php artisan make:migration create_profiles_table