Как создать самореферентные отношения (внешний ключ) в миграции Laravel?

Я начинаю с самообучающегося проекта, построенного на основе Laravel 5.2, и я нашел свою первую проблему: самостоятельную ссылку в процессе миграции.

Вот так файл 2016_08_02_024942_create_navigation_table.php похоже (я удалил комментарии, чтобы не делать пост слишком длинным):

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateNavigationTable extends Migration
{
    public function up()
    {
        Schema::create('navigation', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id')->unsigned();
            $table->integer('position')->unsigned();
            $table->string('title');
            $table->string('slug');
            $table->string('permissions')->nullable();
            $table->timestamps();
            $table->softDeletes();
        });
    }

    public function down()
    {
        Schema::drop('articles');
    }
}

А потом, поскольку я прочитал несколько постов, таких как этот, этот, этот и многие другие, я создаю еще один файл с отношением, названным как 2016_08_02_030158_add_parent_to_navigation_table.php со следующим кодом:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddParentToNavigationTable extends Migration
{
    public function up()
    {
        Schema::table('navigation', function (Blueprint $table) {
            $table->foreign('parent_id')->references('id')->on('navigation')->onUpdate('cascade')->onDelete('cascade');
        });
    }

    public function down()
    {
        Schema::drop('articles');
    }
}

Но когда я запускаю команду php artisan migrate Я получил следующую ошибку, и я не уверен, что я делаю неправильно:

[Illuminate \ Database \ QueryException] SQLSTATE [42S01]: базовая таблица или представление уже существует: 1050 "навигация" таблицы уже существует (SQL: создать таблицу navigation (id int unsigned не нулевой первичный ключ auto_increment, position int без знака, не ноль, title varc har (255) не нуль, slug varchar (255) не нуль, permissions varchar (255) ноль, created_at временная метка ноль, updated_at временная метка ноль, deleted_at отметка времени пустая) набор символов по умолчанию utf8 collate utf8_unicode_ci engin e = InnoDB)

[PDOException] SQLSTATE [42S01]: Базовая таблица или представление уже существует: 1050 Таблица "навигация" уже существует

Кто-нибудь может дать мне совет? Что я делаю не так? Я видел этот пакет, но я не уверен, что он решит мою проблему.

1 ответ

Решение

SQLSTATE[42S01]: Базовая таблица или представление уже существует: 1050 Таблица "навигация" уже существует

Значит, у вас есть одно и то же имя таблицы в базе данных

Поэтому вам нужно проверить, у вас нет таблицы с таким именем в базе данных.

  • Убедитесь, что нет таблицы с таким же именем
  • Запустите миграцию снова

    php artisan migration:rollback Иногда не удается удалить таблицу по разным причинам.

Другие вопросы по тегам