2013-08-25 3 views
8

Привет, У меня возникла проблема с созданием таблицы с помощью построителя схем миграции. Проблема связана с таблицей с внутренним ключом внешней ссылки. Вот код, который производят ошибки:Laravel migration self reference external issue issue

 Schema::create('cb_category', function($table) 
    { 
     $table->integer('id')->primary()->unique()->unsigned(); 
     $table->integer('domain_id')->unsigned(); 
     $table->foreign('domain_id')->references('id')->on('cb_domain'); 
     $table->integer('parent_id')->nullable(); 
     $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
     $table->string('name'); 
     $table->integer('level'); 
    }); 

Здесь ошибка:

SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150) (SQL: alter table `cb_cate 

горы add constraint cb_category_parent_id_foreign foreign key ( parent_id ) references cb_category ( id`) на дель ETE каскада на обновление каскада) (Bindings: массив ( ))

[PDOException] SQLSTATE [HY000]: Общая ошибка: 1005 Невозможно создать таблицу 'eklik2 # SQL-7d4_e' (errno: 150)

Есть идеи?

ответ

5

Вам нужно разбить это на два блока схемы, один из которых создает столбцы, а другой - добавляет FK. mysql не может работать одновременно.

+0

меня сломать его в 2-х заявлений , в любом случае ошибка остается: Schema :: create (...); Schema :: table ('cb_category', function ($ table) { $ table-> foreign ('parent_id') -> ссылки ('id') -> on ('cb_category') -> onUpdate ('cascade ') -> onDelete (' cascade '); }); – gandra404

+1

Решенный с разбивкой. Вот код: Schema :: create ('cb_category', function ($ table) {...}); $ dbh = DB :: getPdo(); $ dbh-> query ("ALTER TABLE cb_category ADD CONSTRAINT fk_cb_category_parent_id FOREIGN KEY (parent_id) ССЫЛКИ cb_category (id) ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ НА ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ"); – gandra404

2

Я может быть слишком поздно для партии, но официальные документы утверждают, что внешний ключ, в случае целого числа, должны быть ->unsigned();

http://laravel.com/docs/4.2/schema#foreign-keys

Note: When creating a foreign key that references an incrementing integer, remember to always make the foreign key column unsigned.

Кроме того, Artisan делает, если не подведет у вас (как у меня) misspell unsigned(), и я потратил немало часов, пытаясь понять, почему ключ не был создан.

Так две вещи: 1. Всегда сделать ключевой столбец внешнего знака в случае приращения целых 2. Проверьте написание unsigned()

1
Schema::create('cb_category', function (Blueprint $table) { 
     $table->increments('id')->unsigned(); 
     $table->integer('domain_id')->unsigned(); 
     $table->foreign('domain_id')->references('id')->on('cb_domain'); 
     $table->integer('parent_id')->nullable(); 
     $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
     $table->string('name'); 
     $table->integer('level'); 
    }); 

Попробуйте

+0

У этой проблемы есть такая же проблема, как и в вопросе. Таблица не может быть использована для ссылки на себя, поскольку она создана, потому что таблица не существует для ссылки во время ее создания, – Jason