Не удается выполнить миграцию в Laravel4 с помощью ClosureTable

#php #laravel #transitive-closure-table

#php #laravel #transitive-closure-table

Вопрос:

Я использую ClosureTable для Laravel. и у меня возникла проблема с миграцией.

Вот как выглядит мой сценарий миграции:

//Скрипт миграции Page_Closure

 public function up()
{
    Schema::table('page_closure', function(Blueprint $table)
    {
        $table->engine = 'InnoDB';

        Schema::create('page_closure', function(Blueprint $t)
        {
            $t->increments('ctid');

            $t->integer('ancestor', false, true);
            $t->integer('descendant', false, true);
            $t->integer('depth', false, true);
              //problem after this line.
            $t->foreign('ancestor')->references('id')->on('pages');
            $t->foreign('descendant')->references('id')->on('pages');
        });
    });
}
  

При создании внешнего ключа возникает ошибка. Не знаю почему, но, основываясь на моей очереди миграции, «закрытие страницы» выполняется первым перед скриптом «страница».

  [IlluminateDatabaseQueryException]                                                                                                              
  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'page_closure' already exists (SQL: create table `page_closure` (`ctid` int unsign  
  ed not null auto_increment primary key, `ancestor` int unsigned not null, `descendant` int unsigned not null, `depth` int unsigned not null) defa  
  ult character set utf8 collate utf8_unicode_ci)  
  

Ответ №1:

Выполнив Schema::table('page_closure', ...) then Schema::create('page_closure', ...) внутри него. По сути, вы говорите Laravel найти существующую таблицу с именем page_closure, а затем создать таблицу с тем же именем. Вот почему вы получаете ошибку «Таблица ‘page_closure’ уже существует».

Вам не нужна Schema::table() часть. Просто поместите свой $table->engine = 'InnoDB' в свой Schema::create() вот так…

 public function up()
{
    Schema::create('page_closure', function(Blueprint $t)
    {
        $table->engine = 'InnoDB';

        $t->increments('ctid');
        // ... the rest of the columns
    }
}
  

Похоже, что ваша таблица тоже уже создана, но миграция не была завершена. Таким образом, ваша таблица миграции, вероятно, повреждена. Вам нужно будет удалить таблицу вручную и снова запустить миграцию.

Комментарии:

1. Привет, Unnawut, этот скрипт миграции был сгенерирован после создания лесов. «php artisan closuretable:make —entity=страница» Я использовал этот пакет github.com/franzose/ClosureTable . Поэтому, должно быть, что-то не так с каркасом, чтобы сгенерировать скрипт миграции с этой ошибкой.

2. @olleh Я думаю, вы могли бы сообщить им об ошибке тогда. Мне кажется неправильным иметь Schema::table() и Schema::create() таблицы с одинаковыми именами внутри друг друга. Я думаю, что в Schema::table() должно быть указано имя вашей таблицы сущностей, а не таблицы закрытия. Возможно, вы можете попробовать изменить это.