#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()
должно быть указано имя вашей таблицы сущностей, а не таблицы закрытия. Возможно, вы можете попробовать изменить это.