SQLSTATE [HY000]: общая ошибка: 1 неизвестный столбец «user_id» в определении внешнего ключа - PullRequest
0 голосов
/ 10 июня 2019

У меня возникает эта ошибка при запуске:

php artisan migrate:fresh

Подсветка \ База данных \ QueryException: SQLSTATE [HY000]: Общая ошибка: 1 неизвестный столбец "user_id" в определении внешнего ключа (SQL:создать таблицу «users» («id» целое число не ноль автоинкремент первичного ключа, «name» varchar не ноль, «email» varchar not ноль, «username» varchar не ноль, «email_verified_at» datetime ноль, «пароль» varchar не ноль,"Remember_token" varchar null, "create_at" datetime null, "updated_at" datetime null, внешний ключ ("user_id") ссылается на "users" ("id") в каскаде удаления))

I 'Я следую видео-учебнику на 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');
    }
}

Если я скопирую и вставлю этот код, у меня будет ошибка.Поэтому я выполнил поиск по stackoverflow и нашел следующее решение:

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 ]

0 голосов
/ 10 июня 2019

Как уже упоминалось, 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');
    });
}
0 голосов
/ 10 июня 2019

Причиной этой проблемы является то, что таблица профиля была создана до пользовательской таблицы.У меня есть хитрость для решения проблемы.

Вы должны переименовать файлы миграции в каталоге миграции.

например, пусть мои имена файлов будут такими:

  • 2019_06_10_000001_create_users_table.php
  • 2019_06_10_000002_create_profiles_table.php

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

1016 * 1016потому что первый созданный файл миграции - это пользовательский файл. Вы должны внимательно посмотреть

  • 2019_06_10_000001 -> имя таблицы пользователей
  • 2019_06_10_000002 -> имя таблицы профилей

Решение: Так что вам просто нужно сделать это: переименовать таблицу «user» и назвать ее численно меньше, чем таблица «profile». Так что проблема решится.

Другое решение: удалить все файлы миграции после запуска их соответственно этой команды.

php artisan make:migration create_users_table
php artisan make:migration create_profiles_table
0 голосов
/ 10 июня 2019

Попробуйте это;

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 в таблице миграции.

0 голосов
/ 10 июня 2019

Здесь явно упоминается ошибка:

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 столбец недоступен в запросе. Поэтому добавьте этот столбец или удалите этот код ограничения и повторите попытку.

...