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
Другие вопросы по тегам