Как создать самореферентные отношения (внешний ключ) в миграции 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
Иногда не удается удалить таблицу по разным причинам.